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

当我在Python库中引发自己的异常时,异常堆栈将raise-line本身显示为堆栈的最后一项。这显然不是错误,在概念上是正确的,但是当您在外部使用代码时,例如作为模块,将注意力集中在对调试无用的事情上。 有没有办法避免这种情况,并强制Python将前一个到最后一个堆栈项显示为最后一个,就像标准的Python库一样。     
已邀请:
适当的警告:通常不赞成修改解释器的行为。在任何情况下,查看错误的确切位置可能有助于调试,特别是如果函数可能由于几个不同的原因引发错误。 如果使用
traceback
模块,并将
sys.excepthook
替换为自定义功能,则可能会执行此操作。但是进行更改会影响整个程序的错误显示,而不仅仅是模块,因此可能不建议这样做。 您还可以查看将代码放入try / except块中,然后修改错误并重新提升它。但是,您的时间可能更好地花费在意外错误上,并为可能出现的错误信息写入信息错误消息。     
你可以在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模块。 以上内容在我自己的模块中用于特定目的。您可以修改并将其用于您的模块。     
我建议不要使用Exception机制来验证参数,就像那样诱人。将条件异常编码为条件就像是说:“如果作为开发人员,我没有想到我提供的参数可能导致的所有不良条件,那么我的应用程序就会崩溃。也许使用例外情况不仅是你无法控制的,而且也是在操作系统或硬件或Python语言之类的其他控制下,我不知道。在实践中,我会在您请求解决方案时使用异常。 为了回答你的问题,在某种程度上,编码就这么简单:
class MyObject(object):
    def saveas(self, filename):
        if not validate_filename(filename):
            return False
        ...
呼叫者
if not myobject.saveas(filename): report_and_retry()
也许不是一个好的答案,只是要考虑的事情。     

要回复问题请先登录注册