gpt4 book ai didi

python - 用户定义的异常 :

转载 作者:太空狗 更新时间:2023-10-29 20:14:34 24 4
gpt4 key购买 nike

我试图在 python 2.7 中定义我自己的异常类,派生自 BaseException

class NestedCommentException(BaseException):
"""
Exception for nested comments
"""
def __init__(self, file_path, list_lines):
self.file_path = file_path
self.list_lines = list_lines

def __repr__(self):
return self.__str__()

def __str__(self):
return 'File {0} contains nested comments at lines {1}'.format(self.file_path, ', '.join(self.list_lines))

但是抛出时,无法打印:raise NestedCommentException(file_path, list_lines) triggers

Traceback (most recent call last):
File "D:\DATA\FP12210\My Documents\Outils\SVN\05_impl\2_tools\svn_tag_setup.py", line 85, in <module>
tag_checks()
File "D:\DATA\FP12210\My Documents\Outils\SVN\05_impl\2_tools\svn_tag_setup.py", line 66, in tag_checks
check_nested_comments(ddl_path)
File "D:\DATA\FP12210\My Documents\Outils\SVN\05_impl\2_tools\svn_tag_setup.py", line 54, in check_nested_comments
raise NestedCommentException(file_path, list_lines)
NestedCommentException: <unprintable NestedCommentException object>

即使我定义了 __str____repr__ 方法,您能解释一下为什么会发生这种情况吗?

最佳答案

长话短说

当你看到这个东西时,基本上意味着在__str__()中出现了某种异常。你的对象。因此,除非问题微不足道,一眼就能看出(例如,忘记了“%s”),要么

  • 包装__str__ body 在 try/except 子句中作为 Anurag 建议,或者

  • 实例化您的异常并调用 __str__ (或您可能拥有的任何方法覆盖)手动,在回溯模块之外,这样你就可以获得完整的异常说明。

分析

其实这个<unprintable MyException object>可以来自 traceback 模块中的各种函数,当试图获取值(异常)的字符串(即“可打印”)版本时,它

  1. 调用 str()在上面,如果出现任何问题,

  2. 尝试将其视为 unicode 并将其转换为 ASCII,如果还有任何问题出错了

  3. 简单地打印上面的表示。

负责代码(在 2.6 和 2.7 中相同):

def _some_str(value):
try:
return str(value)
except Exception:
pass
try:
value = unicode(value)
return value.encode("ascii", "backslashreplace")
except Exception:
pass
return '<unprintable %s object>' % type(value).__name__

如您所见,任何 来自 str() 的异常调用或 unicode.encode()调用在此过程中停止,仅给出“神秘”表示。

关于 traceback 模块与 Python 解释器的注意事项

与什么相反 traceback documentation告诉我们:

It exactly mimics the behavior of the Python interpreter when it prints a stack trace.

Python 解释器给出的表示在这里略有不同。与“不可打印”消息相反,解释器将简单地显示异常的名称,同时停止任何实际的异常。

这里是 a simple script这演示了所有三种方法:将异常留给 Python 解释器、使用回溯模块或手动调用函数。

#!/usr/bin/python

import sys, traceback

class Boom(Exception):

def __init__(self, foo, bar, baz):
self.foo, self.bar, self.baz = foo, bar, baz

def __str__(self):
return ("boom! foo: %s, bar: %s, baz: " # ouch! forgot an %s!
% (self.foo, self.bar, self.baz))

def goBoom(): raise Boom(foo='FOO', bar='BAR', baz='BAZ')

if __name__ == "__main__":

if sys.argv[1].startswith("i"):
goBoom()
# __main__.Boom

elif sys.argv[1].startswith("t"):
try: goBoom()
except: traceback.print_exc(file=sys.stdout)
# Boom: <unprintable Boom object>

elif sys.argv[1].startswith("m"):
e = Boom(foo='FOO', bar='BAR', baz='BAZ')
e.__str__()
# TypeError: not all arguments converted during string formatting

else: pass

关于python - 用户定义的异常 : <unprintable . .. object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com