如何从用户创建的异常类开头去除"__main__.

18 投票
4 回答
4722 浏览
提问于 2025-04-16 03:59

有没有办法让异常信息看起来更好看,而不是前面带有 __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 中,你可以修改异常,格式化它等等。

撰写回答