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.