如何从用户创建的异常类开头去除"__main__.
有没有办法让异常信息看起来更好看,而不是前面带有 __main__MyExceptionTitle
这样的内容呢?
举个例子:
>>> class BadThings(Exception):
... def __init__(self, msg):
... self.msg = msg
... return
...
>>> class BadThings(Exception):
... def __init__(self, msg):
... self.msg = msg
... return
... def __str__(self):
... return self.msg
...
>>> raise BadThings("This is really, really bad")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.BadThings: This is really, really bad
我希望它只显示:
坏事:这真的非常糟糕
就像如果你输入:
>>> raise Exception("This, too, is really, really bad")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: This, too, is really, really bad
我希望 __main__
能消失!
谢谢, Narnie
4 个回答
1
如果你处理了这个异常,你可以随意格式化消息的样式:
>>> try:
... raise BadThings("This is really, really bad")
... except BadThings, e:
... print e.msg
...
This is really, really bad
19
class MyException(Exception):
__module__ = Exception.__module__
这种方法看起来/工作得比 sys.excepthook
更好
源代码参考
Python2
请查看 PyErr_Display
有两种方法可以绕过模块名称部分:
class A(Exception):
__module__ = None
class B(Exception):
__module__ = 'exceptions'
但是如果你需要使用 threading.Thread
,第一种方法会引发一个 TypeError
。
Python 3
请查看 PyErr_WriteUnraisable
class C(Exception):
__module__ = 'builtins'
5
我不太明白你为什么想去掉 __main__
,因为它是模块的名字。当你的异常出现在一个命名合适的模块里时,效果会很好看,而不是难看,比如 myexceptions.BadException
。
另外,你可以捕获异常,然后按你想要的方式打印出来。
但是如果你想让未捕获的异常按照你的方式打印出来,可以试试设置 sys.excepthook
,例如:
class BadThings(Exception): pass
import traceback
def myexcepthook(type, value, tb):
l = ''.join(traceback.format_exception(type, value, tb))
print l
import sys
sys.excepthook = myexcepthook
raise BadThings("bad bad")
输出:
Traceback (most recent call last):
File "untitled-1.py", line 12, in <module>
raise BadThings("bad bad")
BadThings: bad bad
所以在 sys.excepthook
中,你可以修改异常,格式化它等等。