Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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_Exception Handling - Fatal编程技术网

Python如何决定哪个异常处理

Python如何决定哪个异常处理,python,exception-handling,Python,Exception Handling,目前,我正在尝试实现一些异常处理类,就像Python内置的异常类一样。我的问题是python如何决定或选择发生的异常 例如 Example 1 : (Integer/0) is always **ZeroDivisionError** Exception. Example 2 : 'x' + 1 is always **TypeError** Exception. python如何在不使用任何Try和Except块的情况下捕获这些信息。 对于我来说,我必须将我的代码放入一些Try Block中

目前,我正在尝试实现一些异常处理类,就像Python内置的异常类一样。我的问题是python如何决定或选择发生的异常

例如

Example 1 : (Integer/0) is always **ZeroDivisionError** Exception.
Example 2 : 'x' + 1 is always **TypeError** Exception.
python如何在不使用任何Try和Except块的情况下捕获这些信息。

对于我来说,我必须将我的代码放入一些Try Block中,然后放入一些异常名称,这可能并不总是正确的,因为我的异常可以隐藏零除法异常,如下所示:

>>> 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
>>>
>>试试:
...     1/0
... 例外情况除外,如e:
...     引发异常(e)
...
回溯(最近一次呼叫最后一次):
文件“”,第4行,在
例外情况:整数除零或模零
>>>
在我上面的代码中,消息是正确的,但异常名称是错误的。所以,有人请告诉我如何编写异常类以及如何提出正确的异常


感谢您使用Python2.7发布的adv.

,请尝试提升
e
,而不将其强制转换为
异常

try:
    1 / 0
except Exception as e:
    raise e

回溯(最近一次呼叫最后一次):
文件“E:\Proyectos\Eclipse\Python\Test\\uuuuu init\uuuuuu.py”,第4行,在
提高e
ZeroDivisionError:整数除法或模零除法

Edit:正如@abarnet评论的那样(参见下面的评论),通常更建议
raise
而不是
raisee
使用Python 2.7,尝试使用
e
而不将其强制转换为
异常

try:
    1 / 0
except Exception as e:
    raise e

回溯(最近一次呼叫最后一次):
文件“E:\Proyectos\Eclipse\Python\Test\\uuuuu init\uuuuuu.py”,第4行,在
提高e
ZeroDivisionError:整数除法或模零除法

Edit:正如@abarnet评论的那样(参见下面的评论),通常更建议
raise
而不是
raisee
使用Python 2.7,尝试使用
e
而不将其强制转换为
异常

try:
    1 / 0
except Exception as e:
    raise e

回溯(最近一次呼叫最后一次):
文件“E:\Proyectos\Eclipse\Python\Test\\uuuuu init\uuuuuu.py”,第4行,在
提高e
ZeroDivisionError:整数除法或模零除法

Edit:正如@abarnet评论的那样(参见下面的评论),通常更建议
raise
而不是
raisee
使用Python 2.7,尝试使用
e
而不将其强制转换为
异常

try:
    1 / 0
except Exception as e:
    raise e

回溯(最近一次呼叫最后一次):
文件“E:\Proyectos\Eclipse\Python\Test\\uuuuu init\uuuuuu.py”,第4行,在
提高e
ZeroDivisionError:整数除法或模零除法
Edit:正如@abarnet评论的那样(见下面的评论),通常更建议
raise
,而不是
raisee

,在没有任何参数的情况下重新出现相同的错误

>>> 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
>>试试:
...     1/0
... 例外情况除外,如e:
...     在没有任何参数的情况下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
>>试试:
...     1/0
... 例外情况除外,如e:
...     在没有任何参数的情况下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
>>试试:
...     1/0
... 例外情况除外,如e:
...     在没有任何参数的情况下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
>>试试:
...     1/0
... 例外情况除外,如e:

... raise#通过执行raise
Exception(e)
,您正在创建一个类
Exception
的新异常,并将旧异常
e
作为其参数传递给它。它会将该参数转换为字符串,因此最终得到的是一个普通的旧
异常
实例,但带有来自
ZeroDivisionError
的消息

如果要引发现有异常,只需引发异常本身:

raise e
但是,如果您试图重新引发当前异常,则更容易:

raise

要回答您的具体问题:

我的问题是python如何决定或选择发生的异常

一般来说,每个函数的实现都决定要引发哪个异常,但是有一些特殊情况在语言参考的适当部分中进行了解释

对于第一个示例,在CPython中,
int.\uuuu div\uuuu
方法是用C实现的,但它实际上有与此等效的代码:

def __div__(self, other):
    if other == 0:
        raise ZeroDivisionError('integer division or modulo by zero')
    … do usual division stuff in C …
您的第二个示例是其中的一个特殊情况:
+
操作符的实现要求
str.\uuuu add\uuuu
来处理它,但失败了,因此它随后要求
int.\uuu radd\uuuu
来处理它,这也失败了,因此它放弃并引发
类型错误


您的第三个示例……您显式地编写了
raiseexception(e)
,通过执行raise
Exception(e)
,您正在创建一个新的异常,属于类
Exception
,并将旧异常
e
作为其参数传递给它。它会将该参数转换为字符串,因此最终得到的是一个普通的旧
异常
实例,但带有来自
ZeroDivisionError
的消息

如果要引发现有异常,只需引发异常本身:

raise e
但是,如果您试图重新引发当前异常,则更容易:

raise

要回答您的具体问题:

我的问题是python如何决定或选择发生的异常

一般来说,每个函数的实现都决定要引发哪个异常,但是有一些特殊情况在语言参考的适当部分中进行了解释

对于第一个示例,在CPython中,
int.\uuuu div\uuuu
方法是用C实现的,但它实际上有与此等效的代码:

def __div__(self, other):
    if other == 0:
        raise ZeroDivisionError('integer division or modulo by zero')
    … do usual division stuff in C …
您的第二个示例是其中的一个特殊情况:
+
操作符的实现要求
str.\uuuu add\uuuu
来处理它,但失败了,因此它随后要求
int.\uuu radd\uuuu
来处理它,这也失败了,因此它放弃并引发
类型错误

你的第三个例子…我们