python - barplot - pandas plot
Encadenamiento de excepción Python (2)
¿Es esto lo que estás pidiendo?
class MyError(Exception):
def __init__(self, other):
super(MyError, self).__init__(other.message)
>>> try:
... 1/0
... except Exception, e:
... raise MyError(e)
Traceback (most recent call last):
File "<pyshell#27>", line 4, in <module>
raise MyError(e)
MyError: division by zero
Si desea almacenar el objeto de excepción original, ciertamente puede hacerlo en el __init__
su clase de __init__
. En realidad, es posible que desee almacenar el rastreo ya que el objeto de excepción en sí mismo no proporciona mucha información útil sobre dónde se produjo la excepción:
class MyError(Exception):
def __init__(self, other):
self.traceback = sys.exc_info()
super(MyError, self).__init__(other.message)
Después de esto, puede acceder al atributo de traceback
de su excepción para obtener información sobre la excepción original. (Python 3 ya proporciona esto como el atributo __traceback__
de un objeto de excepción).
Esta pregunta ya tiene una respuesta aquí:
- "Excepción interna" (con traceback) en Python? 8 respuestas
¿Existe una forma estándar de usar cadenas de excepción en Python? Al igual que la excepción de Java ''causada por''?
Aquí hay algunos antecedentes.
Tengo un módulo con una clase de excepción principal DSError
:
class DSError(Exception):
pass
En algún lugar dentro de este módulo habrá:
try:
v = my_dict[k]
something(v)
except KeyError as e:
raise DSError("no key %s found for %s" % (k, self))
except ValueError as e:
raise DSError("Bad Value %s found for %s" % (v, self))
except DSError as e:
raise DSError("%s raised in %s" % (e, self))
Básicamente, este fragmento debería arrojar solo DSError y decirme qué sucedió y por qué. El problema es que el bloque try podría arrojar muchas otras excepciones, así que preferiría si pudiera hacer algo como:
try:
v = my_dict[k]
something(v)
except Exception as e:
raise DSError(self, v, e) # Exception chained...
¿Es esta manera estándar de pitón? No vi cadenas de excepciones en otros módulos, entonces ¿cómo se hace eso en Python?
El encadenamiento de excepciones solo está disponible en Python 3, donde puede escribir:
try:
v = {}[''a'']
except KeyError as e:
raise ValueError(''failed'') from e
que produce un resultado como
Traceback (most recent call last):
File "t.py", line 2, in <module>
v = {}[''a'']
KeyError: ''a''
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "t.py", line 4, in <module>
raise ValueError(''failed'') from e
ValueError: failed
En la mayoría de los casos, ni siquiera necesita la opción from
; Python 3 mostrará de forma predeterminada todas las excepciones que se produjeron durante el manejo de excepciones, como este:
Traceback (most recent call last):
File "t.py", line 2, in <module>
v = {}[''a'']
KeyError: ''a''
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "t.py", line 4, in <module>
raise ValueError(''failed'')
ValueError: failed
Lo que puede hacer en Python 2 es agregar atributos personalizados a su clase de excepción, como:
class MyError(Exception):
def __init__(self, message, cause):
super(MyError, self).__init__(message + u'', caused by '' + repr(cause))
self.cause = cause
try:
v = {}[''a'']
except KeyError as e:
raise MyError(''failed'', e)