2010-05-24 8 views
19

Estoy tratando de definir mi propia clase de excepción (muy simple) en Python 2.6, pero no importa cómo lo haga, recibo alguna advertencia.La forma "correcta" de definir una excepción en Python sin la queja de PyLint

En primer lugar, la forma más sencilla:

class MyException(Exception): 
    pass 

Esto funciona, pero imprime un aviso en tiempo de ejecución: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6 bien, así que no es el camino. Entonces intenté:

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

funciona esto también, pero pylint informes una advertencia: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called. Así que traté de llamarlo:

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

Esto funciona, también! Pero ahora PyLint informa un error: E1003: MyException.__init__: Bad first argument 'Exception' given to super class

¿Cómo diablos hago algo tan simple sin advertencias?

+4

'* lint' siempre ha cometido un error al advertir, generando advertencias que realmente no le importan y que pueden provocar que los incautos hagan cosas como agregar métodos no utilizados para tratar de apagarlo. No vale la pena hacer ninguna pelusa para no quejarse, entender todas sus quejas es. – msw

Respuesta

28

Cuando se llama a super, necesita el/clase derivada subclase como primer argumento, no a la clase principal/base.

De la documentación en línea de Python:

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

Así que su excepción se definiría de la siguiente manera:

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

Ah sí, por supuesto! – EMP

+0

Ah, esto fue un salvavidas, aunque incluso iría un poco más allá con el ejemplo, para mostrar algo como esto puedes hacer: super (MyException, self) .__ init __ ('MyException prefix: {0}'. Format (mensaje)), pero de cualquier manera, ¡es una gran respuesta! – lpapp

6

Muy bien, creo que lo descubrí. Esto parece mantener pylint feliz:

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

Su primera manera debería funcionar. Lo uso todo el tiempo en Python 2.6.5. No uso el atributo "mensaje", sin embargo; tal vez por eso recibas una advertencia de tiempo de ejecución en el primer ejemplo.

El siguiente código, por ejemplo, se ejecuta sin errores o advertencias en tiempo de ejecución:

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 

El resultado:

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

No sé si pylint tendría un problema con el anterior .

Cuestiones relacionadas