Python 如何自定义异常消息
该行的第一部分冒号之前是引发的异常的类型。它的格式与以下程序返回的格式相同:Python 如何自定义异常消息,python,python-3.x,Python,Python 3.x,该行的第一部分冒号之前是引发的异常的类型。它的格式与以下程序返回的格式相同: class MyType(type): def __str__(self): return '***' class MyError(Exception, metaclass=MyType): def __str__(self): return 'xxx' print(MyError) # *** print(MyError()) # xxx raise MyError() # still t
class MyType(type):
def __str__(self):
return '***'
class MyError(Exception, metaclass=MyType):
def __str__(self):
return 'xxx'
print(MyError) # ***
print(MyError()) # xxx
raise MyError() # still the same
>>类MyError(异常):
... 通过
...
>>>打印(键入(MyError(“消息”))
通常,您的自定义异常类将放在某个文件(例如file.py)中并导入,因此在这种情况下,它将是file.MyError
isntead of\uuuuuu main\uuuuu.MyError
。但是,由于当前使用的是在主python文件中定义的异常,因此它必须使用的唯一名称空间是\uuuuu main\uuuu
长话短说,如果你想让它更漂亮,用你喜欢的名字把它放在另一个文件中。我能得到的最接近的东西是:
>>> class MyError(Exception):
... pass
...
>>> print(type(MyError("message")))
<class '__main__.MyError'>
但是,我找不到删除:
符号的方法。我猜这个符号是由解释器生成的,以便将异常输出与其他输出类型清楚地分开
以下是我使用的解决方案:
In [6]: raise MyError("some error message")
---------------------------------------------------------------------------
Traceback (most recent call last)
<ipython-input-6-4bd48c5b1ce0> in <module>()
----> 1 raise MyError("some error message")
: some error message
以及一些产出:
class MyError(Exception):
__module__ = None
def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)
self.__class__.__name__ = "CustomTextHere"
您不想捕获并打印消息吗?
\uuuu main\uuuu。MyError
是您作为异常引发的对象。@当然是的,但我通常可以自定义对象的字符串表示形式。在这种情况下并非如此。@yBot Yes of couse,但我正在试图理解异常报告是如何工作的。您可以自定义\uu str\uuuuuuuuuu()
和\uuuu repr\uuuuuu()
,但如果您想自定义解释器打印未处理异常的方式,则需要重新定义sys.excepthook()
。您当然可以处理它。
是MyError
类的字符串表示形式。我可以通过在MyError
的元类中定义\uu str\uuu
来轻松定制它。但正如我所说,我无法更改python异常报告显示的内容。还要注意的是\uuuu main\uuuu.MyError
与
不同。因此我在Python源代码中做了一些挖掘,似乎字符串的确定方式是一样的。;您可以通过重命名类或动态修改MyError来轻松更改类名。但是,我认为没有办法动态更改模块名,因为这是在C源代码中根据执行的文件确定的(注释末尾的链接)。不过,我并不完全清楚这是如何工作的,所以这是可能的。是的,你说得对。你能把这个添加到你的答案中吗?我想我会省去它,因为另一个答案似乎能更好地解决这个问题!我基本上说我不知道这是否可以做到,他们证明了这一点。
In [6]: raise MyError("some error message")
---------------------------------------------------------------------------
Traceback (most recent call last)
<ipython-input-6-4bd48c5b1ce0> in <module>()
----> 1 raise MyError("some error message")
: some error message
class MyError(Exception):
__module__ = None
def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)
self.__class__.__name__ = "CustomTextHere"
In [8]: MyError
Out[8]: MyError
In [9]: MyError()
Out[9]: None.CustomTextHere()
In [11]: raise MyError()
---------------------------------------------------------------------------
CustomTextHere Traceback (most recent call last)
<ipython-input-11-f389ee70e588> in <module>()
----> 1 raise MyError()
CustomTextHere:
In [12]: raise MyError("some error message")
---------------------------------------------------------------------------
CustomTextHere Traceback (most recent call last)
<ipython-input-12-4bd48c5b1ce0> in <module>()
----> 1 raise MyError("some error message")
CustomTextHere: some error message
self.__class__.__name__ = ""