pis*_*bee 1 python exception raise
如果我有一个表达式1/0,显然它会出错:
try:
1/0
except ZeroDivisionError as err:
print(err) # this prints: division by zero
Run Code Online (Sandbox Code Playgroud)
第二次尝试,取而代之的1/0是raise ZeroDivisionError......
try:
raise ZeroDivisionError
except ZeroDivisionError as err:
print(err) # this prints: (nothing)
Run Code Online (Sandbox Code Playgroud)
它什么都不打印.是不是来自异常raise,与一般表达相同?
另外,如何更清楚地理解这种差异?
所有异常都是其子类BaseException,因此所有内置异常都应具有args属性.
args:赋予异常构造函数的参数元组.一些内置异常(例如
OSError)期望一定数量的参数并为该元组的元素赋予特殊含义,而其他异常通常仅使用单个字符串来调用,从而产生错误消息.
该args元组或字符串可以当你抛出异常来提供作为第一个参数.
try:
raise ZeroDivisionError("error")
except ZeroDivisionError as err:
print(err) # prints "error"
Run Code Online (Sandbox Code Playgroud)
该err从except Exception as err:是例外情况下,当你print(err),你实际上调用__str__了异常的方法.大多数Exception类的__str__返回值args,因为它是BaseException的默认行为; __str__如果异常类覆盖BaseException,则返回__str__.
当你提出一个平原ZeroDivisionError,你提供了没有args,并ZeroDivisionError没有自定义__str__方法,因此它args默认打印,也就是说args = None.
至于你的问题:
是不是来自异常
raise,与一般表达相同?
是.他们是一样的.
try:
raise ZeroDivisionError("division by zero")
except ZeroDivisionError as err:
print(err)
Run Code Online (Sandbox Code Playgroud)
这将输出相同的1/0.
我继续深入挖掘源代码. //(整数除法)和/(真正除法)的错误消息略有不同.但基本上它们被定义为:
if (size_b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError,
"division by zero");
return -1;
}
Run Code Online (Sandbox Code Playgroud)
然而size_b是除数.正如你所看到的,1/0或零任何部门提出了ZeroDivsionError用args一套作为"division by zero"或"integer division or modulo by zero"取决于你如何划分.