2008-12-18 8 views
6

Yo quería crear mi propia clase de excepción Python, así:Problema subclasificar BaseException en Python

class MyException(BaseException): 
    def __init__(self, errno, address): 
     if errno == 10048: 
      mess = str(address) + ' is already in use' 
     else: 
      mess = 'Unable to open ' + str(address) 
     BaseException.__init__(mess) 

pero cuando el programa llegó a la llamada a BaseException.__init__(), Tengo este rastreo:

BaseException.__init__(mess) 
TypeError: descriptor '__init__' requires a 'exceptions.BaseException' object but received a 'str' 

Pensé que BaseException tomaría cualquier conjunto de argumentos. Además, ¿cómo se supone que debo pasar un objeto 'exceptions.BaseException' al constructor exceptions.BaseException?

Respuesta

10

usted tiene que llamar el método de la clase base con la instancia como primer argumento:

BaseException.__init__(self, mess) 

citar el tutorial: Un método sobrescrito

en una clase derivada puede en de hecho, desea ampliar en lugar de simplemente reemplazar el método de la clase base del mismo nombre. Hay una manera simple de llamar directamente al método de la clase base: simplemente llame al BaseClassName.methodname(self, arguments). Esto también es de utilidad para los clientes. (Tenga en cuenta que esto sólo funciona si la clase base se define o se importa directamente en el ámbito global.)

Como se ha mencionado por Tony Arkles y en the documentation,

Todo, no es del sistema integrado - las excepciones salientes se derivan de esta clase. Todas las excepciones definidas por el usuario también deben derivarse de [Exception].

lo que no debería heredar de BaseException, de todos modos ...

+0

Gracias. Esta no es la primera vez que olvido usar 'yo' en alguna parte; Estoy seguro de que no será el último. –

+2

Es por eso que prefiero usar super() antes de llamar al método __init__ explícitamente. Si olvida el auto argumento a super(), obtiene un error inmediatamente. –

+0

En Python 3 'super()' ya no requiere argumentos. – hop

6

hop está en lo cierto.

Como nota al margen, realmente no debería subclasificar BaseException, en su lugar debería estar subclasando Excepción. (A menos que realmente sepa lo que está haciendo)

+0

sí, debería haber mencionado eso ... – hop

Cuestiones relacionadas