xticks barplot python exception coding-style python-2.x

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í:

¿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)