2010-07-12 19 views
10

मैं तर्क के बिना अपवाद उठाने के बारे में सबसे अच्छा अभ्यास जानना चाहता हूं। आधिकारिक अजगर प्रलेखन में, आप यह देख सकते हैं:पाइथन, बिना तर्क के अपवाद को

try: 
    raise KeyboardInterrupt 

(। http://docs.python.org/tutorial/errors.html अध्याय 8.6)

और कुछ विभिन्न कोड, Django या गूगल कोड की तरह है, आप यह देख सकते हैं:

def AuthenticateAndRun(self, username, password, args): 
    raise NotImplementedError() 

(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)

अपवाद उठाया जा रहा है, जबकि वहाँ कोई तर्क है पहले instanciate है। तर्क के बिना अपवाद को तत्काल करने का उद्देश्य क्या है? जब मुझे पहले मामले या दूसरे मामले का उपयोग करना चाहिए?

अग्रिम फेबियन

उत्तर

3

धन्यवाद एक अपवाद उदाहरण के बजाय एक अपवाद वर्ग स्थापना वाक्य रचना हटा दिया गया है और नए कोड में नहीं किया जाना चाहिए।

raise Exception, "This is not how to raise an exception..." 
+0

उन उत्सुक लोगों के लिए, अपवाद से संबंधित बहिष्करण के बारे में अधिक जानकारी के लिए http://www.python.org/dev/peps/pep-0352/#transition-plan देखें। –

+8

मैं यह समझने में सक्षम नहीं हूं कि आप क्या सिफारिश कर रहे हैं। आपका कोड उदाहरण ** ** ** नहीं करना प्रतीत होता है। शायद आपको दिखाना चाहिए कि * क्या किया जाना चाहिए। –

+0

अभी भी सुनिश्चित नहीं है कि क्या किया जाना चाहिए। – FrenchKheldar

0

सी ++ जैसी भाषाओं में आप किसी भी वस्तु को उठा सकते हैं, केवल अपवाद नहीं। पायथन अधिक बाध्य है। यदि आप का प्रयास करें:

raise 1 

आप मिल:

Traceback (most recent call last): 
... 
TypeError: exceptions must be old-style classes or derived from BaseException, not int 

अजगर प्रोग्रामिंग मॉडल में आप आमतौर पर एक वर्ग अपने आप में एक उदाहरण के बजाय (उपयोग कर सकते हैं इस अनूठी उदाहरणों में से तेजी से निर्माण के लिए उपयोगी होता है, बस को परिभाषित एक कक्षा)। इसलिए कोई आश्चर्य नहीं कि आप एक अपवाद उदाहरण के बजाय अपवाद वर्ग बढ़ा सकते हैं।

हालांकि इग्नासिओ ने कहा, यह बहिष्कृत है।

इसके अलावा, कुछ अतिरिक्त नोट है कि सीधे सवाल नहीं है:

तुम भी कुछ कोड में अपने आप में अकेले उठाना देख सकता था। किसी ऑब्जेक्ट क्लास या कुछ भी के बिना। इसका उपयोग अपवाद हैंडलरों में वर्तमान अपवाद को फिर से बढ़ाने के लिए किया जाता है और प्रारंभिक ट्रेसबैक रखेगा।

3

आप जो भी फॉर्म चाहें उसका उपयोग कर सकते हैं। कोई वास्तविक अंतर नहीं है और दोनों पायथन 2 और 3 में कानूनी हैं। Python style guide निर्दिष्ट नहीं करता कि कौन सी सिफारिश की जाती है।


"वर्ग फार्म" समर्थन पर एक छोटी सी में अधिक जानकारी:

बढ़ाने:

try: 
    raise KeyboardInterrupt 

यह फार्म दोनों अजगर 2 और 3 pep-3109 से अंश में पूरी तरह से कानूनी है एक नया अपवाद बढ़ाने के लिए बहिष्कार का उपयोग किया जाता है। इस फॉर्म में दो उप-वेरिएंट हैं: एक्सेप्शन एक अपवाद वर्ग या अपवाद वर्ग का उदाहरण हो सकता है; मान्य अपवाद वर्ग बेसएक्सप्शन और इसके सबक्लास [5] हैं।यदि एक्सेप्शन एक उप-वर्ग है, तो इसे अपवाद उदाहरण प्राप्त करने के लिए तर्कों के साथ बुलाया जाएगा।

यह भी Python documentation में वर्णित है:

... यदि यह एक वर्ग है, अपवाद उदाहरण है जब कोई तर्क के साथ वर्ग instantiating द्वारा जरूरत प्राप्त की जाएगी।