如果我的表达式为1/0
,显然会出现错误:
try:
1/0
except ZeroDivisionError as err:
print(err) # this prints: division by zero
第二次尝试,将1/0
替换为raise ZeroDivisionError
...
try:
raise ZeroDivisionError
except ZeroDivisionError as err:
print(err) # this prints: (nothing)
它什么都不打印。 raise
不是例外,与一般表达式相同吗?
另外,如何更清楚地理解这种差异?
答案 0 :(得分:6)
所有异常都是BaseException
的子类,因此所有内置异常都应具有args
属性。
args
:赋予异常构造函数的参数元组。一些 内置异常(如
OSError
)期望一定数量的异常 参数并为此元组的元素赋予特殊含义, 而其他人通常只用一个字符串来表示 错误信息。
当您引发异常时,可以提供args
元组或字符串作为第一个参数。
try:
raise ZeroDivisionError("error")
except ZeroDivisionError as err:
print(err) # prints "error"
来自err
的{{1}}是异常实例,当您except Exception as err:
时,您实际上正在调用异常的print(err)
方法。大多数Exception class's __str__
return's args
,因为它是BaseException的默认行为;如果异常类覆盖BaseException的__str__
,则__str__
将返回。
当您提出简单__str__
时,您没有提供ZeroDivisionError
,args
没有自定义ZeroDivisionError
方法,因此它打印了__str__
默认,又名args
。
关于你的问题:
来自
args = None
的异常不是一般表达式吗?
是。他们是一样的。
raise
这将输出与try:
raise ZeroDivisionError("division by zero")
except ZeroDivisionError as err:
print(err)
相同的内容。
我继续挖掘source code。 1/0
(整数除法)和//
(真正除法)的错误消息略有不同。但基本上它们被定义为:
/
而if (size_b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError,
"division by zero");
return -1;
}
是除数。正如您所看到的,size_b
或任何除以零会将1/0
设置为ZeroDivsionError
或args
,这取决于您的划分方式。