Python如何决定哪种异常处理

时间:2014-01-19 04:40:19

标签: python exception-handling

目前,我正在尝试实现一些异常处理类,就像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
>>>

在上面的代码中,消息是正确的,但异常名称是错误的。所以,有人请解释我如何编写异常类以及如何提出正确的异常。

先谢谢。

3 个答案:

答案 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