有人知道如何在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中设置断点仍然不起作用。
答案 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 。
还有一个补丁,但不幸的是它到目前为止尚未合并。