38

我见过与此类似的问题,但没有一个真正解决了引用问题。如果我有这样的课

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"

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

如果遇到错误,唯一应该打印出来的东西看起来像(我以 3 为例,格式不是问题)这个。

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

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

4

7 回答 7

65

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

Python 2.x

import sys
sys.tracebacklimit = 0

Python 3.x

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

在 Python 3.6.2 及更高版本中,您应该设置tracebacklimit0or -1,因为将其设置为None不会禁用回溯输出。

Python 3.6.1 和以下结果:

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

Python 3.6.2 及以上结果:

>>> import sys

>>> sys.tracebacklimit = 0
>>> raise Exception
Exception

>>> sys.tracebacklimit = -1
>>> raise Exception
Exception

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

然而,无论好坏,如果引发多个异常,它们仍然可以打印。例如:

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>
于 2014-02-04T15:42:54.647 回答
18

您可以使用 SystemExit 异常:

except Exception as err:
    raise SystemExit(err)

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

于 2020-03-25T10:40:32.747 回答
14

您可以使用 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'
>>> 

编辑2:至于关闭程序,您总是可以raise出错,或者您可以使用sys.exit()

于 2013-07-22T10:21:45.913 回答
11

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

你实现了一个三参数函数,它接受typevaluetraceback并且做任何你喜欢的事情(比如,只打印值)并将该函数分配给sys.excepthook.

这是一个例子:

import sys

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

sys.excepthook = excepthook

raise ValueError('hello')

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

于 2017-04-11T09:45:10.007 回答
6

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

蟒蛇 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")

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

MyNewError (line 16): Now TraceBack Is Gone
于 2017-01-01T09:09:10.353 回答
3

通常,如果您想捕获任何异常 except SystemExit,并在没有回溯的情况下退出异常消息,请main按如下方式定义您的函数:

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

请注意,在引发多个异常的情况下,只会打印一条消息。

该答案旨在改进The-IT的答案。

于 2016-10-07T00:31:02.747 回答
3

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

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

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
于 2021-03-18T14:46:31.833 回答