Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何自定义异常消息_Python_Python 3.x - Fatal编程技术网

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__ = ""