2008-09-18 13 views
10

लंबी कहानी छोटी है, मेरे पास एक महत्वपूर्ण पायथन एप्लिकेशन है जो कि अन्य चीजों के साथ, लिनक्स पर "लॉसेटअप", "माउंट" इत्यादि से बाहर निकलता है। अनिवार्य रूप से उपभोग करने वाले सिस्टम संसाधन जिन्हें पूरा होने पर जारी किया जाना चाहिए।क्या एप्लिकेशन-व्यापी अपवाद हैंडलर समझ में आता है?

यदि मेरा एप्लिकेशन क्रैश हो जाता है, तो मैं यह सुनिश्चित करना चाहता हूं कि इन सिस्टम संसाधनों को ठीक से रिलीज़ किया गया हो।

क्या यह कुछ ऐसा करने का अर्थ है?

def main(): 
    # TODO: main application entry point 
    pass 

def cleanup(): 
    # TODO: release system resources here 
    pass 

if __name__ == "__main__": 
    try: 
     main() 
    except: 
     cleanup() 
     raise 

यह कुछ ऐसा है आम तौर पर किया जाता है है? क्या कोई बेहतर तरीका है? शायद एक सिंगलटन कक्षा में विनाशक?

उत्तर

11

मुझे सामान्य रूप से शीर्ष स्तर के अपवाद हैंडलर पसंद हैं (भाषा के बावजूद)। वे ऐसे संसाधनों को साफ करने के लिए एक बेहतरीन जगह हैं जो अपवाद को फेंकने वाली विधि के अंदर खपत संसाधनों से तुरंत संबंधित नहीं हो सकते हैं।

यह लॉग उन अपवादों के लिए भी एक शानदार जगह है जहां आपके पास ऐसा ढांचा है। शीर्ष-स्तरीय हैंडलर उन विचित्र अपवादों को पकड़ लेंगे जिन पर आपने योजना नहीं बनाई थी और भविष्य में उन्हें सही करने की अनुमति दी, अन्यथा, आप उनके बारे में कभी भी नहीं जानते।

बस सावधान रहें कि आपके शीर्ष-स्तर वाले हैंडलर अपवाद नहीं फेंकते हैं!

+0

शीर्ष-स्तर अपवाद हैंडलर जीयूआई अनुप्रयोगों में उपयोगी हैं। इवेंट हैंडलरों में फेंकने वाले अपवाद अपवाद कंसोल में दिखाई देंगे, लेकिन सामान्य रूप से प्रोग्राम को क्रैश नहीं करेंगे (उदा। पीजीजीटीके और पीईक्यूटी में), यह अनजान हो सकता है। यदि आप हैंडलर में एक त्रुटि संवाद दिखाते हैं, तो आपको वह समस्या नहीं है। –

+0

मैं यह भी सुझाव दूंगा कि आप उन्हें कंसोल ऐप्स में डाल दें जो बैच प्रोसेसिंग करते हैं। मैंने उन्हें एक ईमेल भेज दिया है ताकि हमें किसी भी समस्या का अधिसूचित किया जा सके, लेकिन कम से कम यह इसे लॉग कर सकता है। –

2

आवेदन विस्तृत हैंडलर ठीक है। वे लॉगिंग के लिए महान हैं। बस सुनिश्चित करें कि आवेदन व्यापक एक टिकाऊ है और खुद को दुर्घटनाग्रस्त होने की संभावना नहीं है।

7

एक विनाशक (जैसा कि __del__ विधि में) एक बुरा विचार है, क्योंकि इन्हें कॉल करने की गारंटी नहीं है। एटएक्सिट मॉड्यूल एक सुरक्षित दृष्टिकोण है, हालांकि पाइथन दुभाषिया क्रैश (पायथन एप्लिकेशन के बजाए), या यदि os._exit() का उपयोग किया जाता है, या प्रक्रिया आक्रामक रूप से मारे जाती है, या मशीन रीबूट हो जाती है, तो ये अभी भी आग नहीं लगेंगे। (बेशक, अंतिम आइटम आपके मामले में कोई समस्या नहीं है।) यदि आपकी प्रक्रिया क्रैश-प्रवण है (उदाहरण के लिए यह फिकल थर्ड-पार्टी एक्सटेंशन मॉड्यूल का उपयोग करती है) तो आप एक साधारण मूल प्रक्रिया में सफाई करना चाह सकते हैं अधिक अलगाव

यदि आप वास्तव में चिंतित नहीं हैं, तो एटएक्सिट मॉड्यूल का उपयोग करें।

+0

मुझे पूरी तरह से यकीन नहीं था कि विनाशक को भी बुलाया जाएगा। स्पष्टीकरण के लिए धन्यवाद! ऐसा प्रतीत होता है कि मुझे वही चाहिए जो मुझे चाहिए। – EmmEff

1

यह एक उचित दृष्टिकोण की तरह लगता है, और एक सिंगलटन वर्ग पर विनाशक की तुलना में अधिक सरल और विश्वसनीय है। आप "atexit" मॉड्यूल को भी देख सकते हैं। ("बाहर निकलने पर", "यह कोई तकनीक नहीं है" या ऐसा कुछ नहीं। मैंने लंबे समय तक भ्रमित किया।)

2

यदि आप कक्षाओं का उपयोग करते हैं, तो आपको निश्चित रूप से उनके विनाशकों में आवंटित संसाधनों को मुक्त करना चाहिए । प्रयास का प्रयोग करें: पूरे आवेदन पर अगर आप उन संसाधनों को मुक्त करना चाहते हैं जो पहले से ही आपके वर्ग के विनाशकों द्वारा मुक्त नहीं हैं।

और बजाय एक का उपयोग करने का कैच-ऑल छोड़कर :, आप निम्नलिखित ब्लॉक का उपयोग करना चाहिए:

try: 
    main() 
finally: 
    cleanup() 

यह एक अधिक pythonic तरह से सफाई सुनिश्चित करेगा।

1

एक संदर्भ प्रबंधक लिखने और विवरण के साथ उपयोग करने पर विचार करें।

संबंधित मुद्दे