2009-07-17 5 views
11

Kann ich den Exitstatus von selves process in at_exit block bestimmen?ruby ​​at_exit exit status

at_exit do 
    if this_process_status.success? 
    print 'Success' 
    else 
    print 'Failure' 
    end 
end 

Antwort

14

mit Idee von 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 
+2

nur meine meinung wäre, tadman anstelle von sich selbst den "check" zu geben/zucken. –

+1

Ich denke, dass die vollste Antwort überprüft werden sollte. Check ist am nützlichsten für andere Benutzer, die nach Antworten suchen und ich denke nicht, dass sich irgendetwas für mich und Tadman ändern wird, egal welche Antwort ich überprüfen werde. – tig

+0

Ich denke, mit 'at_exit' ist das ok für kleine Skripte. Bei größeren Anwendungen sollten Sie 'exit' (oder Ihre eigene Methode zum Behandeln von Exits aufrufen) an den beabsichtigten Exitpunkten verwenden und Fehler, Ausnahmen und Signale explizit behandeln. – Kelvin

17

Obwohl die Dokumentation zu diesem Thema wirklich dünn ist, $! wird als die letzte auftretende Ausnahme festgelegt, und nach einem Aufruf von exit() ist dies eine SystemExit-Ausnahme. die beiden zusammen setzen Sie diese:

at_exit do 
    if ($!.success?) 
    print 'Success' 
    else 
    print 'Failure' 
    end 
end 
+0

Das wird der Fall sein, wenn nur Exit aufgerufen wird. Sicher kann ich testen, ob $! ist nil oder ist SystemExit, die auf Erfolg antwortet? Aber ist es möglich, Process :: Status-Objekt zu erhalten, oder es ist nicht für den oberen Prozess erstellt? – tig

+0

mit Ihrer Idee habe ich Antwort und Posted aber ich weiß nicht, welche Antwort ist besser zu markieren - Ihre oder meine? – tig

+0

Was für Sie funktioniert. Wusste nicht, dass du deine eigene Frage "beantworten" könntest, aber okay. – tadman

Verwandte Themen