首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不在异常堆栈中显示Python提升行

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

Stack Overflow用户
提问于 2010-12-12 08:27:18
回答 3查看 4K关注 0票数 24

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

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

EN

回答 3

Stack Overflow用户

发布于 2010-12-12 08:55:58

应有的警告:修改解释器的行为通常是不受欢迎的。在任何情况下,准确地查看引发错误的位置可能对调试很有帮助,特别是当函数可能因为几种不同的原因而引发错误时。

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

您还可以考虑将代码放在try/except块中,然后修改错误并重新引发它。但是,您的时间可能更好地用于避免意外错误,并为可能出现的错误编写信息性错误消息。

票数 7
EN

Stack Overflow用户

发布于 2016-11-25 15:12:12

你可以在python中创建你自己的异常钩子。下面是我使用的代码示例。

代码语言:javascript
复制
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)

下面是我在自定义异常代码中使用的一些行。

代码语言:javascript
复制
sys.excepthook = exceptionHandler
raise Exception("My Custom error message.")

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

上面的代码在我自己的模块中用于特定的目的。您可以修改它并将其用于您的模块。

票数 4
EN

Stack Overflow用户

发布于 2015-06-13 05:11:30

我建议不要使用异常机制来验证参数,尽管这很诱人。使用异常作为条件条件进行编码就像是在说,“作为一个开发人员,如果我没有考虑到我提供的参数可能导致的所有糟糕情况,就会使我的应用程序崩溃。也许使用异常不仅是你所能控制的事情,而且是在其他东西的控制下,比如操作系统、硬件或Python语言,我不知道。在实践中,当你请求解决方案时,我会使用异常。”

为了回答你的问题,在某种程度上,编写代码也很简单:

代码语言:javascript
复制
class MyObject(object):
    def saveas(self, filename):
        if not validate_filename(filename):
            return False
        ...

调用者

代码语言:javascript
复制
if not myobject.saveas(filename): report_and_retry()

也许不是一个很好的答案,只是一些值得思考的事情。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4419785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档