2009-07-17 15 views
11

क्या मैं at_exit ब्लॉक में सेल्व प्रक्रिया से बाहर निकलने की स्थिति निर्धारित कर सकता हूं?ruby ​​at_exit निकास स्थिति

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

उत्तर

14

विचार का उपयोग कर 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

सिर्फ मेरी राय है कि आप खुद को/शग के बजाय टैडमैन को "चेक" दें। –

+1

मुझे लगता है कि पूरा जवाब जांचना चाहिए। चेक अन्य उपयोगकर्ताओं के लिए उत्तर की तलाश में सबसे उपयोगी है और मुझे नहीं लगता कि मेरे लिए और कुछ भी बदलेगा, जो भी जवाब मैं जांचूंगा। – tig

+0

मुझे लगता है कि इसके लिए 'at_exit' का उपयोग करना छोटी स्क्रिप्ट के लिए ठीक है। बड़े ऐप्स के लिए, आपको इच्छित निकास बिंदुओं पर 'निकास' (या निकास को संभालने के लिए अपनी विधि को कॉल करना) का उपयोग करना चाहिए, और त्रुटियों, अपवादों और सिग्नल को स्पष्ट रूप से संभालना चाहिए। – Kelvin

17

हालांकि इस पर दस्तावेज़ वास्तव में पतला है, $! जो होता है वह अंतिम अपवाद होता है, और बाहर निकलने के बाद() कॉल यह सिस्टमएक्सिट अपवाद है। लाना उन दोनों एक साथ आप इस मिल:

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

मामले को केवल तभी बाहर निकलने के लिए कहा जाएगा हो जाएगा कि। निश्चित रूप से मैं परीक्षण कर सकता हूं अगर $! शून्य है या SystemExit है जो सफलता पर सच है? लेकिन क्या प्रक्रिया :: स्थिति ऑब्जेक्ट प्राप्त करना संभव है या यह शीर्ष प्रक्रिया के लिए नहीं बनाया गया है? – tig

+0

आपके विचार का उपयोग करके मुझे जवाब मिला और पोस्ट किया गया लेकिन मुझे नहीं पता कि कौन सा जवाब चिह्नित करना बेहतर है - आपका या मेरा? – tig

+0

जो भी आपके लिए काम करता है। पता नहीं था कि आप अपने सवाल का जवाब दे सकते हैं, लेकिन ठीक है। – tadman