为什么"提高异常"会导致什么结果?

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/0raise ZeroDivisionError......

try:
    raise ZeroDivisionError
except ZeroDivisionError as err:
    print(err)                      # this prints: (nothing)
Run Code Online (Sandbox Code Playgroud)

它什么都不打印.是不是来自异常raise,与一般表达相同?

另外,如何更清楚地理解这种差异?

abc*_*ccd 6

所有异常都是其子类BaseException,因此所有内置异常都应具有args属性.

args:

赋予异常构造函数的参数元组.一些内置异常(例如OSError)期望一定数量的参数并为该元组的元素赋予特殊含义,而其他异常通常仅使用单个字符串来调用,从而产生错误消息.

args元组或字符串可以当你抛出异常来提供作为第一个参数.

try:
    raise ZeroDivisionError("error")
except ZeroDivisionError as err:
    print(err)  # prints "error"
Run Code Online (Sandbox Code Playgroud)

errexcept 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或零任何部门提出了ZeroDivsionErrorargs一套作为"division by zero""integer division or modulo by zero"取决于你如何划分.