Python如何决定哪个异常处理
目前,我正在尝试实现一些异常处理类,就像Python内置的异常类一样。我的问题是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中
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#通过执行raiseException(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)
,通过执行raiseException(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
来处理它,这也失败了,因此它放弃并引发类型错误
你的第三个例子…我们