Python异常类中的异常\uuuu str\uuuuuuu丢失

Python异常类中的异常\uuuu str\uuuuuuu丢失,python,exception,Python,Exception,有人知道如何在python Exception的派生类的_str___函数中捕获异常吗?以及如何使用pdb调试它,因为我发现在调用pdb.set_trace或在函数_str_uuuu中的pdb中设置断点时它不起作用 示例代码: class Ex(Exception): def __str__(self): raise KeyError('1') raise Ex() 输出是 Traceback (most recent call last): File "./ex

有人知道如何在python Exception的派生类的_str___函数中捕获异常吗?以及如何使用pdb调试它,因为我发现在调用pdb.set_trace或在函数_str_uuuu中的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
如果我在raisekeyerror'1'之前添加pdb.set_跟踪,python运行时不会在pdb.set_跟踪处中断。那么,有人知道如何调试异常吗?当异常有点复杂时

很抱歉pdb.set\U跟踪案例。它起作用了。但是,如果您忘记输入import pdb,那么python会稍微忽略异常,这看起来像是pdb.set_trace被忽略了


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

您不需要覆盖uu str_u_u_u_u_u_u_u_u________;来获取消息。只要做:

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

Python处理异常的方式不同,因为它正在打印异常。在这一点上承认另一个异常只会让程序员感到困惑,因此Python会接受它并尽其所能


写你的类“\uu str\uu”总是返回一个字符串,你会更快乐。

前几天我也遇到了同样的问题。最后,我将异常的_str_______)方法包装在try/except块中。大概是这样的:

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'

FWIW,我不久前打开了一个Python bug,它至少使输出不那么混乱:


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

在那里引发异常的目的是什么?@IgnacioVazquez Abrams我不打算在那里引发异常。My _str _函数非常复杂,它可能包含一些导致python运行时引发一些系统异常的错误。我想调试那些bug,听起来像是噩梦。你是否考虑过简化实际的方法,并使用单独的方法获取更多信息?@IgnacioVazquez Abrams真是一场噩梦。所以我问这里是否有任何方法来调试_ustr__;中的代码。使用单独的方法需要更改程序的设计,这是另一个噩梦。@writalnaie它不需要更改任何设计。您可以将一个方法拆分为多个方法,而无需更改API或影响程序的其余部分。但是,我返回的字符串是由一个非常复杂的函数生成的,该函数可能包含一些错误,例如引用dict中不存在的某个键的KeyError。这就是我必须调试_str________________函数的原因。然后自己捕获这些错误并妥善处理它们。感谢您的解释。在不实际运行代码的情况下,静态地查找错误有点困难,因为返回字符串的生成函数非常复杂。我的目的不是用正确的格式引发异常。我想调试\uuuu str\uuuuuu中的异常。不要为此引发异常-使用断点或精心选择的打印语句…谢谢,我尝试了pdb.set\u trace或在\uuuu str\uuuuu中添加断点。它们都不起作用。实际上,我不知道在函数_str_______________________________________。我重新尝试了pdb.set_跟踪方法,如果您不忘记导入pdb,它也可以工作。所以,也许你同样的问题是忘记了导入pdb?在我的情况下,我只是想要回溯。这是您首先要做的,因为它将捕获错误,例如忘记导入pdb或在发布示例代码之前在示例代码中发现的两个bug。
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'