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
您可以通过限制其深度来关闭回溯.
import sys
sys.tracebacklimit = 0
Run Code Online (Sandbox Code Playgroud)
在Python 3.5.2和3.6.1,设置tracebacklimit到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
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)
小智 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.
您实现了一个三参数函数,该函数接受type、value和traceback并执行您喜欢的任何操作(例如,仅打印值)并将该函数分配给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 中都可用。
你可以使用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)
如果你想摆脱海关例外的任何追溯并有行号,你可以这样做
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)
| 归档时间: |
|
| 查看次数: |
33929 次 |
| 最近记录: |