Python:我可以使用 def __raise__(self): 重载 raise 语句吗?
这是我使用 raise 的异常类:
class SCE(Exception):
"""
An error while performing SCE functions.
"""
def __init__(self, value=None):
"""
Message: A string message or an iterable of strings.
"""
if value is None:
self._values = []
elif isinstance(value, str):
self._values = [value]
else:
self._values = list(value)
def __raise__(self):
print('raising')
if not len(self._values):
return
def __str__(self):
return self.__repr__()
def __iter__(self):
return iter(self._values)
def __repr__(self):
return repr(self._values)
目前,如果我引发这个没有值的异常,我会得到回溯,然后是:
__main__.SCE: []
而不是我所期望的:
raising
>>>
你如何重载 raise
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
正如另一个答案所说,没有 __raise__ 特殊方法。 2004 年,comp.lang.python 上有一个帖子,其中有人建议添加这样的方法,但我认为没有任何后续行动。我能想到的挂钩异常引发的唯一方法是修补解释器,或者进行某种源代码或字节码重写,在引发操作旁边插入函数调用。
As the other answer says, there is no
__raise__
special method. There was a thread in 2004 on comp.lang.python where someone suggested adding such a method, but I don't think there was any followup to that. The only way I can think of to hook exception raising is either by patching the interpreter, or some kind of source or bytecode rewriting that inserts a function call next to the raise operation.没有这样特殊的方法
__raise__
(至少我没有听说过或者可以在 Python 文档)。你为什么要这样做?我想不出您希望在引发异常时执行自定义代码的任何原因(而不是在构造异常时执行,您可以使用 __init__ 方法来执行,或者在异常被捕获,您可以使用
except
块来实现)。这种行为的用例是什么?为什么您期望 Python 支持它?There is no such special method
__raise__
(at least none that I have ever heard of or that I can find in the Python documentation).Why do you want to do this? I can't think of any reason why you want custom code be be executed when the exception is raised (as opposed to either when the exception is constructed, which you can do with the
__init__
method, or when the exception is caught, which you can do with anexcept
block). What is your use case for this behavior, and why do you expect that Python supports it?正如其他人所说,没有这样的私有方法
__raise__
。没有什么可以阻止定义一个。例如:这是输出:
As others have stated, there is no such private method
__raise__
. Nothing prevents defining one. For example:Here is the output: