The "correct" way to define an exception in Python without PyLint complaining
Question:
I’m trying to define my own (very simple) exception class in Python 2.6, but no matter how I do it I get some warning.
First, the simplest way:
class MyException(Exception):
pass
This works, but prints out a warning at runtime: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6 OK, so that’s not the way. I then tried:
class MyException(Exception):
def __init__(self, message):
self.message = message
This also works, but PyLint reports a warning: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called
. So I tried calling it:
class MyException(Exception):
def __init__(self, message):
super(Exception, self).__init__(message)
self.message = message
This works, too! But now PyLint reports an error: E1003: MyException.__init__: Bad first argument 'Exception' given to super class
How the hell do I do such a simple thing without any warnings?
Answers:
Alright, I think I figured it out. This seems to keep PyLint happy:
class MyException(Exception):
def __init__(self, message):
Exception.__init__(self, message)
self.message = message
When you call super
, you need the subclass/derived class as the first argument, not the main/base class.
From the Python online documentation:
class C(B):
def method(self, arg):
super(C, self).method(arg)
So your exception would be defined as follows:
class MyException(Exception):
def __init__(self, message):
super(MyException, self).__init__(message)
self.message = message
Your first way should work. I use it myself all the time in Python 2.6.5. I don’t use the “message” attribute, however; maybe that’s why you’re getting a runtime warning in the first example.
The following code, for example, runs without any errors or runtime warnings:
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
The result:
>>> catcher()
My message error value: 3
I don’t know if PyLint would have a problem with the above.
I’m trying to define my own (very simple) exception class in Python 2.6, but no matter how I do it I get some warning.
First, the simplest way:
class MyException(Exception):
pass
This works, but prints out a warning at runtime: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6 OK, so that’s not the way. I then tried:
class MyException(Exception):
def __init__(self, message):
self.message = message
This also works, but PyLint reports a warning: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called
. So I tried calling it:
class MyException(Exception):
def __init__(self, message):
super(Exception, self).__init__(message)
self.message = message
This works, too! But now PyLint reports an error: E1003: MyException.__init__: Bad first argument 'Exception' given to super class
How the hell do I do such a simple thing without any warnings?
Alright, I think I figured it out. This seems to keep PyLint happy:
class MyException(Exception):
def __init__(self, message):
Exception.__init__(self, message)
self.message = message
When you call super
, you need the subclass/derived class as the first argument, not the main/base class.
From the Python online documentation:
class C(B):
def method(self, arg):
super(C, self).method(arg)
So your exception would be defined as follows:
class MyException(Exception):
def __init__(self, message):
super(MyException, self).__init__(message)
self.message = message
Your first way should work. I use it myself all the time in Python 2.6.5. I don’t use the “message” attribute, however; maybe that’s why you’re getting a runtime warning in the first example.
The following code, for example, runs without any errors or runtime warnings:
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
The result:
>>> catcher()
My message error value: 3
I don’t know if PyLint would have a problem with the above.