una salto print lista linea imprimir hace funcion end como agregar python exception error-handling customization traceback

salto - En Python, ¿cómo imprimo un mensaje de error sin imprimir un rastreo y cierro el programa cuando no se cumple una condición?



salto de linea en una lista python (5)

Puede utilizar una try: y luego except Exception as inst: lo que hará es darle su mensaje de error en una variable llamada inst y puede imprimir los argumentos sobre el error con inst.args . Intenta imprimirlo y ver qué sucede, y cualquier elemento en inst.args es el que estás buscando.

EDITAR Aquí hay un ejemplo que probé con pitones IDLE:

>>> try: open("epik.sjj") except Exception as inst: d = inst >>> d FileNotFoundError(2, ''No such file or directory'') >>> d.args (2, ''No such file or directory'') >>> d.args[1] ''No such file or directory'' >>>

EDIT 2: en cuanto al cierre del programa, siempre puede raise y error o puede usar sys.exit()

He visto preguntas similares a esta, pero ninguna de ellas aborda el trackback. Si tengo una clase como esa

class Stop_if_no_then(): def __init__(self, value one, operator, value_two, then, line_or_label, line_number): self._firstvalue = value_one self._secondvalue = value_two self._operator = operator self._gohere = line_or_label self._then = then self._line_number = line_number def execute(self, OtherClass): "code comparing the first two values and making changes etc"

Lo que quiero que mi método de ejecución pueda hacer es si self._then no es igual a la cadena "THEN" (en allcaps) entonces quiero que genere un mensaje de error personalizado y termine todo el programa sin mostrar un traceback .

Si se encuentra el error, lo único que se debería imprimir sería algo así como (estoy usando 3 como ejemplo, el formateo no es un problema) esto.

`Syntax Error (Line 3): No -THEN- present in the statement.`

No soy muy exigente con respecto a que realmente sea un objeto de clase de excepción, por lo que no hay ningún problema en ese aspecto. Como usaré esto en un ciclo while, simple si, elif simplemente repite el mensaje una y otra vez (porque obviamente no estoy cerrando el ciclo). He visto sys.exit () pero eso también imprime un bloque gigante de texto rojo, a menos que no lo esté usando correctamente. No quiero atrapar la excepción en mi ciclo porque hay otras clases en el mismo módulo en las que necesito implementar algo como esto.


Si desea deshacerse de cualquier rastreo para las excepciones de aduanas y tener el número de línea, puede hacer este truco

Python 3

import sys import inspect class NoTraceBackWithLineNumber(Exception): def __init__(self, msg): try: ln = sys.exc_info()[-1].tb_lineno except AttributeError: ln = inspect.currentframe().f_back.f_lineno self.args = "{0.__name__} (line {1}): {2}".format(type(self), ln, msg), sys.exit(self) class MyNewError(NoTraceBackWithLineNumber): pass raise MyNewError("Now TraceBack Is Gone")

Dará esta salida y hará que la palabra clave raise inútil

MyNewError (line 16): Now TraceBack Is Gone


En general, si desea capturar cualquier excepción, excepto SystemExit , y salir con el mensaje de la excepción sin traceback, defina su función main siguiente manera:

>>> import sys >>> def main(): ... try: ... # Run your program from here. ... raise RandomException # For testing ... except (Exception, KeyboardInterrupt) as exc: ... sys.exit(exc) ... >>> main() name ''RandomException'' is not defined $ echo $? 1

Tenga en cuenta que, en el caso de que se generen múltiples excepciones, solo se imprime un mensaje.

Esta respuesta está destinada a mejorar la de The-IT .


Puede desactivar la trazabilidad limitando su profundidad.

Python 2.x

import sys sys.tracebacklimit = 0

Python 3.x

En Python 3.5.2 y 3.6.1, establecer tracebacklimit en 0 no parece tener el efecto deseado. Este es un error conocido. Tenga en cuenta que -1 tampoco funciona. None embargo, establecerlo en None parece funcionar, al menos por ahora.

>>> import sys >>> sys.tracebacklimit = 0 >>> raise Exception Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception >>> sys.tracebacklimit = -1 >>> raise Exception Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception >>> sys.tracebacklimit = None >>> raise Exception Exception

Sin embargo, para bien o para mal, si se generan múltiples excepciones, aún pueden imprimirse. Por ejemplo:

socket.gaierror: [Errno -2] Name or service not known During handling of the above exception, another exception occurred: urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>


La forma más limpia que conozco es usar sys.excepthook .

Implementa una función de tres argumentos que acepta type , value y traceback y hace lo que le gusta (por ejemplo, solo imprime el valor) y asigna esa función a sys.excepthook .

Aquí hay un ejemplo:

import sys def excepthook(type, value, traceback): print(value) sys.excepthook = excepthook raise ValueError(''hello'')

Esto está disponible tanto en python 2 como en python 3.