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?

Asked By: EMP

||

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
Answered By: EMP

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
Answered By: Dustin

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.

Answered By: Peter Milley
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.