Python异常类中的异常__str__错过了

时间:2014-08-19 02:11:13

标签: python exception

有人知道如何在python异常的派生类的__str__函数中捕获异常吗?以及如何使用pdb调试__str__因为我发现它在函数pdb.set_trace()中调用__str__或在pdb中设置断点时不起作用。

示例代码:

class Ex(Exception):
    def __str__(self):
        raise KeyError('1')

raise Ex()

输出

Traceback (most recent call last):
  File "./exex.py", line 10, in <module>
    raise Ex()
__main__.Ex

虽然我认为输出应该像

KeyError: '1'

如果我在pdb.set_trace()之前添加raise KeyError('1'),python运行时不会在pdb.set_trace()中断。那么当有点复杂时,是否有人知道如何调试Exception.__str__


pdb.set_trace()案件感到抱歉。有用。但是,如果您忘记放置import pdb,则python会略微忽略看起来像pdb.set_trace()的异常。

虽然在pdb中设置断点仍然不起作用。

4 个答案:

答案 0 :(得分:0)

您无需覆盖__str__即可收到消息。只是做:

class Ex(Exception):
   pass

raise Ex('Key Error 1')

打印:

Traceback (most recent call last):
  File "Untitled.py", line 4, in <module>
    raise Ex('Key Error 1')
__main__.Ex: Key Error 1

答案 1 :(得分:0)

Python处理异常的方式不同,因为它在打印异常的过程中。此时承认另一个异常只会让程序员感到困惑,因此Python吞下它并尽其所能。

写你的班级'__str__总是返回一个字符串,你会更开心。

答案 2 :(得分:0)

前几天我遇到了同样的问题。我最终在try / except块中包装了我的异常__str__方法。像这样:

import traceback

class ex(Exception):
    def do_str(self):
        return "ex: %s" % self.notexist

    def check_str(self):
        try:
            return self.do_str()
        except:
            traceback.print_exc()
            raise

    __str__ = check_str

raise ex()

当你运行它时会打印:

Traceback (most recent call last):
  File "t100.py", line 16, in <module>
    raise ex()
__main__.exTraceback (most recent call last):
  File "t100.py", line 9, in check_str
    return self.do_str()
  File "t100.py", line 5, in do_str
    return "ex: %s" % self.notexist
AttributeError: 'ex' object has no attribute 'notexist'

答案 3 :(得分:0)

FWIW,我前面打开了一个Python错误,至少让输出变得有点混乱:issue22836

还有一个补丁,但不幸的是它到目前为止尚未合并。