24

当我在 Python 库中引发自己的异常时,异常堆栈将引发行本身显示为堆栈的最后一项。这显然不是一个错误,在概念上是正确的,但是当您在外部使用代码(例如作为模块)时,将重点放在对调试无用的东西上。

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

4

3 回答 3

7

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

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

您还可以查看将代码放在 try/except 块中,然后修改错误并重新引发它。但是你最好把时间花在减少意外错误的可能性上,并为可能出现的错误编写信息性错误消息。

于 2010-12-12T00:55:58.370 回答
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 模块。

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

于 2016-11-25T07:12:11.523 回答
-2

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

为了回答你的问题,部分地,这样编码同样简单:

class MyObject(object):
    def saveas(self, filename):
        if not validate_filename(filename):
            return False
        ...

呼叫者

if not myobject.saveas(filename): report_and_retry()

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

于 2015-06-12T21:11:30.213 回答