validar try tipos por excepciones errores error ejemplos diferentes comunes python exception stack raise

try - No mostrar Python raise-line en la pila de excepciones



try except python 3 (3)

Cuando subo mis propias excepciones en mis bibliotecas de Python, la pila de excepciones muestra la línea de subida como el último elemento de la pila. Obviamente, esto no es un error, es conceptualmente correcto, pero apunta al foco en algo que no es útil para la depuración cuando está utilizando el código externamente, por ejemplo, como un módulo.

¿Hay alguna forma de evitar esto y obligar a Python a mostrar el último elemento de la pila como el último, como las bibliotecas de Python estándar?


Advertencia debida: la modificación del comportamiento del intérprete generalmente está mal vista. Y en cualquier caso, ver exactamente dónde se generó un error puede ser útil para la depuración, especialmente si una función puede provocar un error por varias razones diferentes.

Si usa el módulo de sys.excepthook y reemplaza sys.excepthook con una función personalizada, probablemente sea posible hacerlo. Pero hacer el cambio afectará la visualización de errores para todo el programa, no solo para su módulo, por lo que probablemente no sea recomendable.

También puede mirar poner código en bloques try / except, luego modificar el error y volver a elevarlo. Pero es probable que su tiempo se gaste mejor haciendo errores inesperados y escribiendo mensajes de error informativos para aquellos que puedan surgir.


Yo sugeriría no usar el mecanismo de Excepción para validar argumentos, por muy tentador que sea. Codificar con excepciones como condicionales es como decir "colapsar mi aplicación si, como desarrollador, no pienso en todas las malas condiciones que pueden causar mis argumentos proporcionados. Tal vez usar excepciones para cosas no solo fuera de tu control sino también bajo control de otra cosa como el sistema operativo o el hardware o el lenguaje Python sería más lógico, no lo sé. En la práctica, sin embargo, utilizo excepciones cuando solicita una solución.

Para responder a su pregunta, en parte, es tan simple codificar así:

class MyObject(object): def saveas(self, filename): if not validate_filename(filename): return False ...

llamador

if not myobject.saveas(filename): report_and_retry()

Quizás no sea una gran respuesta, solo algo en que pensar.


puedes crear tu propio gancho de excepción en python. A continuación se muestra el ejemplo de código que estoy usando.

import sys import traceback def exceptionHandler(got_exception_type, got_exception, got_traceback): listing = traceback.format_exception(got_exception_type, got_exception, got_traceback) # Removing the listing of statement raise (raise line). del listing[-2] filelist = ["org.python.pydev"] # avoiding the debuger modules. listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ] files = [line for line in listing if line.startswith(" File")] if len(files) == 1: # only one file, remove the header. del listing[0] print>>sys.stderr, "".join(listing)

Y a continuación hay algunas líneas que he usado en mi código de excepción personalizado.

sys.excepthook = exceptionHandler raise Exception("My Custom error message.")

En la excepción del método, puede agregar nombres de archivo o nombre de módulo en la lista "nombres de archivo" si desea ignorar cualquier archivo no deseado. Como he ignorado el módulo pydev de Python desde que estoy usando el depurador pydev en eclipse.

Lo anterior se usa en mi propio módulo para un propósito específico. Puedes modificarlo y usarlo para tus módulos.