目前,我正在尝试实现一些异常处理类,就像Python内置异常类一样。我的问题是python如何决定或选择发生的异常,
例如
Example 1 : (Integer/0) is always **ZeroDivisionError** Exception.
Example 2 : 'x' + 1 is always **TypeError** Exception.
python如何在不使用任何 Try and Except块的情况下捕获它。
对我来说,我必须将我的代码放在 Try Block 中,然后放入一些异常名称,这可能并不总是正确的,因为我的异常可以隐藏 ZeroDivision 如下例外:
>>> try:
... 1 / 0
... except Exception as e:
... raise Exception (e)
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
Exception: integer division or modulo by zero
>>>
在上面的代码中,消息是正确的,但异常名称是错误的。所以,有人请解释我如何编写异常类以及如何提出正确的异常。
先谢谢。
答案 0 :(得分:1)
使用Python 2.7,尝试引发e
而不将其转换为Exception
:
try:
1 / 0
except Exception as e:
raise e
Traceback (most recent call last):
File "E:\Proyectos\Eclipse\Python\Test\__init__.py", line 4, in <module>
raise e
ZeroDivisionError: integer division or modulo by zero
修改:@abarnet发表评论(请参阅下面的评论),通常建议raise
而不是raise e
。
答案 1 :(得分:1)
raise
没有任何争论再加上同样的错误。
>>> try:
... 1 / 0
... except Exception as e:
... raise # <----
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero
答案 2 :(得分:1)
通过加注Exception (e)
,您创建类Exception
的新异常,并将旧的异常e
作为参数传递给它。它会将该参数转换为字符串,因此您最终得到的是一个普通的Exception
实例,但是来自ZeroDivisionError
的消息。
如果要引发现有异常,只需引发异常:
raise e
但是,如果您尝试重新引发当前异常,那就更容易了:
raise
回答您的具体问题:
我的问题是python如何决定或选择发生的异常,
通常,每个函数的实现决定引发哪个异常,但是在语言引用的相应部分中有一些特殊情况需要解释。
对于您的第一个示例,在CPython中,int.__div__
方法在C中实现,但它实际上具有与此相当的代码:
def __div__(self, other):
if other == 0:
raise ZeroDivisionError('integer division or modulo by zero')
… do usual division stuff in C …
您的第二个示例是其中一个特殊情况:+
运算符的实现要求str.__add__
处理它,然后失败,然后它要求int.__radd__
处理它,并且也失败,因此放弃并提出TypeError
。
你的第三个例子......好吧,你明确写了raise Exception(e)
,并提出Exception
。