Python 打印错误消息而不打印回溯,并在不满足条件时关闭程序

Python 打印错误消息而不打印回溯,并在不满足条件时关闭程序,python,exception,error-handling,customization,traceback,Python,Exception,Error Handling,Customization,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 = o

我见过类似的问题,但没有一个能真正解决追踪问题。 如果我有这样的课

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"
我希望我的execute方法能够做到的是,如果self.\u then不等于字符串“then”(在allcaps中),那么我希望它发出自定义错误消息并终止整个程序,同时也不显示回溯

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


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

您可以使用
try:
然后
除异常以外的指令:
这将在名为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:对于关闭程序,您可以始终
引发
和错误,或者您可以使用
sys.exit()

通过限制其深度来关闭回溯

Python2.x Python3.x 在Python 3.5.2和3.6.1中,设置为
0
似乎没有预期的效果。这是一个众所周知的问题。请注意,
-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
导入系统 >>>sys.tracebacklimit=0 >>>引发异常 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 例外情况 >>>sys.tracebacklimit=-1 >>>引发异常 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 例外情况 >>>sys.tracebacklimit=无 >>>引发异常 例外情况 然而,不管是好是坏,如果提出了多个异常,它们仍然可以打印出来。例如:

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>
socket.gaierro:[Errno-2]名称或服务未知
在处理上述异常期间,发生了另一个异常:
urllib.error.urleror:

通常,如果要捕获除
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
请注意,在引发多个异常的情况下,只打印一条消息


此答案旨在改进。

如果您想消除海关例外情况的任何追溯,并拥有行号, 你可以做这个把戏

Python 3 将给出此输出,并使
raise
关键字无效

MyNewError (line 16): Now TraceBack Is Gone

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

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

以下是一个例子:

import sys

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

sys.excepthook = excepthook

raise ValueError('hello')

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

您可以使用SystemExit异常:

except Exception as err:
    raise SystemExit(err)

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

>>试试:
...     打开('database.sqlite')
... 除IOError外:
...     从“无”引发运行时错误
回溯(最近一次呼叫最后一次):
文件“”,第4行,在

d.args中的“2”是什么?错误消息“没有这样的文件或目录”是可自定义的(如果我创建了自己的异常类对象)?老实说,我不知道2是什么,但它并不重要。我正在演示如何自己查找错误消息。还有“没有这样的文件或目录”“是一个字符串,您可以将其放入变量中,然后使用它做任何您想做的事情
errorMessage=d.args[1]
该特定代码行的实际错误是
FileNotFoundError:[Errno 2]没有这样的文件或目录:“epik.sjj”
,所以这就是2的来源。
.args
是错误所有部分的元组。为什么不只是一个简单的
打印('blah-blah-blah')
而不是'd=inst'?@IT
2
第一个参数来自,是
errno.enoint
的值。第二个参数
“没有这样的文件或目录”
os.strerror(errno.enoint)
的输出。您也可以将
SystemExit子类化。让我们来看看。让我们来看看。有没有办法只在控制台中打印值,同时在日志中完全回溯?当然。您可以使用回溯模块,在“execepthook”函数中执行任何您想要的操作。
sys.tracebacklimit=0
现在可以在Python 3.7中正常工作
sys.tracebacklimit=None
在我的情况下不起作用。为了节省您在页面上搜索的时间。
MyNewError (line 16): Now TraceBack Is Gone
import sys

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

sys.excepthook = excepthook

raise ValueError('hello')
except Exception as err:
    raise SystemExit(err)