2010-05-24 9 views
19

शिकायत करने के लिए मैं पाइथन 2.6 में अपनी खुद की (बहुत सरल) अपवाद कक्षा को परिभाषित करने की कोशिश कर रहा हूं, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं इसे कैसे चेतावनी देता हूं।पायथन के बिना पाइथन में अपवाद को परिभाषित करने के लिए "सही" तरीका

सबसे पहले, सबसे आसान तरीका:

class MyException(Exception): 
    pass 

यह काम करता है, लेकिन क्रम में एक चेतावनी बाहर प्रिंट: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6 ठीक है, तो यह है कि जिस तरह से नहीं है। मैं तो कोशिश की:

class MyException(Exception): 
    def __init__(self, message): 
     self.message = message 

यह भी काम करता है, लेकिन PyLint एक चेतावनी रिपोर्ट: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called। इसलिए मैंने इसे कॉल करने का प्रयास किया:

class MyException(Exception): 
    def __init__(self, message): 
     super(Exception, self).__init__(message) 
     self.message = message 

यह भी काम करता है! लेकिन अब पाइलिंट एक त्रुटि की रिपोर्ट करता है: E1003: MyException.__init__: Bad first argument 'Exception' given to super class

मैं बिना किसी चेतावनी के इतनी सरल चीज़ कैसे कर सकता हूं?

+4

'* लिंट' हमेशा चेतावनी के पक्ष में मिटा दिया गया है जिससे चेतावनी उत्पन्न होती है कि आप वास्तव में परवाह नहीं करते हैं और इसे बंद करने की कोशिश करने के लिए अप्रयुक्त तरीकों को जोड़ने जैसी चीजों को करने के लिए अनचाहे संकेत दे सकते हैं। किसी भी लिंट को शिकायत नहीं करना एक सार्थक लक्ष्य नहीं है, इसकी सभी शिकायतों को समझना है। – msw

उत्तर

28

जब आप super कहते हैं, आप पहले तर्क, नहीं मुख्य/आधार वर्ग के रूप में उपवर्ग/व्युत्पन्न वर्ग की जरूरत है: यह PyLint खुश रखने के लिए लगता है।

अजगर ऑनलाइन प्रलेखन से

:

class C(B): 
    def method(self, arg): 
     super(C, self).method(arg) 

तो अपने अपवाद इस प्रकार के रूप में परिभाषित किया जाएगा:

class MyException(Exception): 
    def __init__(self, message): 
     super(MyException, self).__init__(message) 
     self.message = message 
+1

आह हाँ, ज़ाहिर है! – EMP

+0

आह, यह एक लाइव सेवर था, हालांकि मैं उदाहरण के साथ थोड़ा और आगे जाऊंगा, ऐसा कुछ दिखाने के लिए जो आप कर सकते हैं: सुपर (माईएक्सप्शन, स्वयं) .__ init __ ('MyException उपसर्ग: {0}' प्रारूप (संदेश)), लेकिन किसी भी तरह से, यह एक अच्छा जवाब है! – lpapp

6

ठीक है, मुझे लगता है कि मैंने इसे समझ लिया।

class MyException(Exception): 
    def __init__(self, message): 
     Exception.__init__(self, message) 
     self.message = message 
0

आपका पहला तरीका काम करना चाहिए। मैं पाइथन 2.6.5 में हर समय इसे अपने आप उपयोग करता हूं। मैं "संदेश" विशेषता का उपयोग नहीं करता, हालांकि; शायद यही कारण है कि आपको पहले उदाहरण में रनटाइम चेतावनी मिल रही है।

class MyException(Exception): 
    pass 

def thrower(): 
    error_value = 3 
    raise MyException("My message", error_value) 
    return 4 

def catcher(): 
    try: 
     print thrower() 
    except MyException as (message, error_value): 
     print message, "error value:", error_value 

परिणाम:

>>> catcher() 
My message error value: 3 

मैं अगर PyLint ऊपर के साथ एक समस्या के लिए होता है पता नहीं है

निम्नलिखित कोड, उदाहरण के लिए, किसी भी त्रुटि या क्रम चेतावनी के बिना चलाता है ।

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

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