不要在异常堆栈中显示Python提升行

时间:2010-12-12 00:27:18

标签: python exception stack raise

当我在我的Python库中引发我自己的异常时,异常堆栈将引线本身显示为堆栈的最后一项。这显然不是错误,在概念上是正确的,但是当您在外部使用代码时,例如作为模块,将注意力集中在对调试无用的事情上。

有没有办法避免这种情况,并强制Python将前一个到最后一个堆栈项显示为最后一个堆栈项,就像标准的Python库一样。

3 个答案:

答案 0 :(得分:7)

适当警告:通常不赞成修改解释器的行为。在任何情况下,查看错误引发的确切位置可能有助于调试,特别是如果函数可能由于多种原因引发错误。

如果您使用traceback模块,并将sys.excepthook替换为自定义函数,则可能会执行此操作。但是进行更改会影响整个程序的错误显示,而不仅仅是模块,因此可能不建议这样做。

您还可以查看将代码放入try / except块,然后修改错误并重新提升它。但是,您的时间可能更好地花费在意外错误上,并为那些可能出现的错误消息编写信息性错误消息。

答案 1 :(得分:4)

你可以在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.")

在方法异常中,如果要忽略任何不需要的文件,可以在列表“文件名”中添加文件名或模块名。因为我在eclipse中使用了pydev调试器,所以我忽略了python pydev模块。

以上内容在我自己的模块中用于特定目的。您可以修改并将其用于您的模块。

答案 2 :(得分:-1)

我建议不要使用Exception机制来验证参数,因为这很诱人。将条件异常编码为条件就像是说,如果作为开发人员,我不会想到我提供的参数可能导致的所有不良条件,那么我的应用程序就会崩溃。也许使用异常的东西不仅是你无法控制的,而且还受到操作系统或硬件或Python语言等其他东西的控制,这些更合乎逻辑,我不知道。但实际上,当您请求解决方案时,我会使用异常。

要回答你的问题,部分原因是这样编码也很简单:

event.preventDefault()

呼叫者

$('#buttonID').click(function(event){
    event.preventDefault();
    //remainder of button click code goes here
});

也许不是一个好的答案,只需要考虑一下。