在不打印回溯的情况下打印错误消息,并在不满足条件时关闭程序

use*_*035 16 python error-handling customization exception traceback

我已经看到了类似的问题,但没有一个真正解决了引用.如果我有这样的课程

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"
Run Code Online (Sandbox Code Playgroud)

我希望我的执行方法能够做的是,如果self._then不等于字符串"THEN"(在allcaps中),那么我希望它引发自定义错误消息并终止整个程序,同时也不显示追溯.

如果遇到错误,唯一应该打印的东西看起来像(我使用3作为示例,格式化不是问题)这个.

`Syntax Error (Line 3): No -THEN- present in the statement.`
Run Code Online (Sandbox Code Playgroud)

我不是很挑剔它实际上是一个异常类对象,所以在这方面没有问题.因为我将在while循环中使用它,简单如果,elif只是一遍又一遍地重复该消息(因为显然我没有关闭循环).我见过sys.exit(),但是也打印出一个巨大的红色文本块,除非我没有正确使用它.我不想在循环中捕获异常,因为在同一个模块中还有其他类需要实现这样的东西.

Mar*_*sta 51

您可以通过限制其深度来关闭回溯.

Python 2.x

import sys
sys.tracebacklimit = 0
Run Code Online (Sandbox Code Playgroud)

Python 3.x

在Python 3.5.2和3.6.1,设置tracebacklimit0似乎并没有产生预期的效果.这是一个已知的错误.请注意,这-1也不起作用.None然而,设置它确实似乎有效,至少目前如此.

>>> 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
Run Code Online (Sandbox Code Playgroud)

然而,无论好坏,如果提出多个例外,它们仍然可以打印出来.例如:

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>
Run Code Online (Sandbox Code Playgroud)

  • `sys.tracebacklimit = 0` 现在适用于 Python 3.7。`sys.tracebacklimit = None` 在我的情况下不起作用。 (9认同)

小智 14

您可以使用 SystemExit 异常:

except Exception as err:
    raise SystemExit(err)
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3/library/exceptions.html


Mar*_*zer 10

我所知道的最干净的方法是使用sys.excepthook.

您实现了一个三参数函数,该函数接受typevaluetraceback并执行您喜欢的任何操作(例如,仅打印值)并将该函数分配给sys.excepthook

下面是一个例子:

import sys

def excepthook(type, value, traceback):
    print(value)

sys.excepthook = excepthook

raise ValueError('hello')
Run Code Online (Sandbox Code Playgroud)

这在 python 2 和 python 3 中都可用。


The*_*-IT 8

你可以使用a try:然后except Exception as inst: 它会做什么就是在名为inst的变量中给你你的错误信息,你可以打印出错误的参数inst.args.尝试将其打印出来并看看会发生什么,并且任何项目inst.args都是您正在寻找的项目.

编辑这是我用pythons 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'
>>> 
Run Code Online (Sandbox Code Playgroud)

编辑2:至于关闭程序,你可以随时raise和错误,或者你可以使用sys.exit()


小智 8

“可以通过使用禁用异常链from None” - Python 文档

>>> try:
...     open('database.sqlite')
... except IOError:
...     raise RuntimeError from None

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
Run Code Online (Sandbox Code Playgroud)


cre*_*uil 5

如果你想摆脱海关例外的任何追溯并有行号,你可以这样做

蟒蛇 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")
Run Code Online (Sandbox Code Playgroud)

将给出此输出,并使raise关键字无用

MyNewError (line 16): Now TraceBack Is Gone
Run Code Online (Sandbox Code Playgroud)

  • 你也可以子类化`SystemExit`。 (2认同)