当我在Python库中引发自己的异常时,异常堆栈将提升行本身显示为堆栈的最后一项。这显然不是一个错误,在概念上是正确的,但它将重点放在了当您在外部使用代码时对调试没有用处的东西,例如作为一个模块。
有没有办法避免这种情况,并强制Python将倒数第二个堆栈项目显示为最后一个堆栈项目,就像标准Python库一样。
发布于 2010-12-12 08:55:58
应有的警告:修改解释器的行为通常是不受欢迎的。在任何情况下,准确地查看引发错误的位置可能对调试很有帮助,特别是当函数可能因为几种不同的原因而引发错误时。
如果您使用traceback
模块,并用自定义函数替换sys.excepthook
,则可能实现这一点。但进行更改将影响整个程序的错误显示,而不仅仅是您的模块,因此可能不建议这样做。
您还可以考虑将代码放在try/except块中,然后修改错误并重新引发它。但是,您的时间可能更好地用于避免意外错误,并为可能出现的错误编写信息性错误消息。
发布于 2016-11-25 15:12:12
你可以在python中创建你自己的异常钩子。下面是我使用的代码示例。
import sys
import traceback
def exceptionHandler(got_exception_type, got_exception, got_traceback):
listing = traceback.format_exception(got_exception_type, got_exception, got_traceback)
# Removing the listing of statement raise (raise line).
del listing[-2]
filelist = ["org.python.pydev"] # avoiding the debuger modules.
listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ]
files = [line for line in listing if line.startswith(" File")]
if len(files) == 1:
# only one file, remove the header.
del listing[0]
print>>sys.stderr, "".join(listing)
下面是我在自定义异常代码中使用的一些行。
sys.excepthook = exceptionHandler
raise Exception("My Custom error message.")
在方法异常中,如果您想忽略任何不需要的文件,可以在"filenames“列表中添加文件名或模块名。因为我忽略了python pydev模块,因为我正在使用eclipse中的pydev调试器。
上面的代码在我自己的模块中用于特定的目的。您可以修改它并将其用于您的模块。
发布于 2015-06-13 05:11:30
我建议不要使用异常机制来验证参数,尽管这很诱人。使用异常作为条件条件进行编码就像是在说,“作为一个开发人员,如果我没有考虑到我提供的参数可能导致的所有糟糕情况,就会使我的应用程序崩溃。也许使用异常不仅是你所能控制的事情,而且是在其他东西的控制下,比如操作系统、硬件或Python语言,我不知道。在实践中,当你请求解决方案时,我会使用异常。”
为了回答你的问题,在某种程度上,编写代码也很简单:
class MyObject(object):
def saveas(self, filename):
if not validate_filename(filename):
return False
...
调用者
if not myobject.saveas(filename): report_and_retry()
也许不是一个很好的答案,只是一些值得思考的事情。
https://stackoverflow.com/questions/4419785
复制相似问题