ruby at_exit exit status
Asked Answered
O

2

17

Can i determine selves process exit status in at_exit block?

at_exit do
  if this_process_status.success?
    print 'Success'
  else
    print 'Failure'
  end
end
Oppidan answered 17/7, 2009 at 15:38 Comment(0)
O
23

using idea from tadman

at_exit do
  if $!.nil? || ($!.is_a?(SystemExit) && $!.success?)
    print 'success'
  else
    code = $!.is_a?(SystemExit) ? $!.status : 1
    print "failure with code #{code}"
  end
end

or without Perlisms:

require 'English'

at_exit do
  if $ERROR_INFO.nil? || ($ERROR_INFO.is_a?(SystemExit) && $ERROR_INFO.success?)
    print 'success'
  else
    code = $ERROR_INFO.is_a?(SystemExit) ? $ERROR_INFO.status : 1
    print "failure with code #{code}"
  end
end
Oppidan answered 20/7, 2009 at 16:50 Comment(7)
just my opinion would be to give the "check" to tadman instead of yourself /shrug.Aluminium
I think that the fullest answer should be checked. Check is most useful for other users looking for answer and I don't think that anything will change for me and tadman, whatever answer I will check.Oppidan
I think using at_exit for this is ok for small scripts. For larger apps, you should be using exit (or calling your own method to handle exits) at the intended exit points, and handling errors, exceptions, and signals explicitly.Embarrassment
What is the ($!.is_a?(SystemExit) && $!.success?)?Leastwise
@Leastwise Check if exit is happening due to explicit call to exit (or raise SystemExit) and exit code is successful (equal to 0)Oppidan
@Oppidan interesting. I wish the SystemExit had .to_i so you could do $!.to_i.zero? instead of it all.Leastwise
@Leastwise It has also status, so you can $!.status.zero? (or even monkey-patch to_i alias), but you still need to check if it is a SystemExit first.Oppidan
E
20

Although the documentation on this is really thin, $! is set to be the last exception that occurs, and after an exit() call this is a SystemExit exception. Putting those two together you get this:

at_exit do
  if ($!.success?)
    print 'Success'
  else
    print 'Failure'
  end
end
Effeminacy answered 17/7, 2009 at 20:30 Comment(3)
That will be the case only if exit will be called. Surely I can be test if $! is nil or is SystemExit which answers true on success? But is it possible to get Process::Status object or it is not created for the top process?Oppidan
using your idea I got answer and posted but I don't know which answer is better to mark - yours or mine?Oppidan
Whatever works for you. Didn't know you could "answer" your own question, but okay.Effeminacy

© 2022 - 2024 — McMap. All rights reserved.