我已经看到了类似的问题,但没有一个真正解决了引用。 如果我有这样的课程
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”(在allcaps中)那么我希望它引发自定义错误消息并终止整个程序而不是显示回溯。
如果遇到错误,唯一应该打印出来的东西就像(我使用3作为示例,格式化不是问题)这个。
`Syntax Error (Line 3): No -THEN- present in the statement.`
我不是很挑剔它实际上是一个异常类对象,因此在这方面没有问题。因为我将在while循环中使用它,简单如果,elif只是一遍又一遍地重复该消息(因为显然我没有关闭循环)。我见过sys.exit(),但是也打印出一个巨大的红色文本块,除非我没有正确使用它。我不想在循环中捕获异常,因为在同一模块中还有其他类需要实现这样的类。
答案 0 :(得分:48)
您可以通过限制其深度来关闭回溯。
import sys
sys.tracebacklimit = 0
在Python 3.5.2和3.6.1中,将tracebacklimit
设置为0
似乎没有预期的效果。这是一个已知的bug。请注意,-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
然而,无论好坏,如果引发多个例外,它们仍然可以打印出来。例如:
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>
答案 1 :(得分:8)
您可以使用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()
答案 2 :(得分:4)
我所知道的最简洁的方法是使用sys.excepthook
。
您实现了一个接受type
,value
和traceback
的三参数函数,并执行您喜欢的任何操作(例如,仅打印值)并将该函数分配给{{1 }}
以下是一个例子:
sys.excepthook
这在python 2和python 3中均可用。
答案 3 :(得分:4)
您可以使用SystemExit例外:
except Exception as err:
raise SystemExit(err)
答案 4 :(得分: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
答案 5 :(得分:2)
通常,如果要捕获除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
请注意,如果引发多个异常,则只打印一条消息。
这个答案旨在改进one by The-IT。
答案 6 :(得分:0)
"可以使用 from None
" - Python docs
>>> try:
... open('database.sqlite')
... except IOError:
... raise RuntimeError from None
Traceback (most recent call last):
File "<stdin>", line 4, in <module>