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

时间:2018-02-24 15:24:53

标签: python exception raise

如果我的表达式为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不是例外,与一般表达式相同吗?

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

1 个答案:

答案 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__时,您没有提供ZeroDivisionErrorargs没有自定义ZeroDivisionError方法,因此它打印了__str__默认,又名args

关于你的问题:

  

来自args = None的异常不是一般表达式吗?

是。他们是一样的。

raise

这将输出与try: raise ZeroDivisionError("division by zero") except ZeroDivisionError as err: print(err) 相同的内容。

我继续挖掘source code1/0(整数除法)和//(真正除法)的错误消息略有不同。但基本上它们被定义为:

/

if (size_b == 0) { PyErr_SetString(PyExc_ZeroDivisionError, "division by zero"); return -1; } 是除数。正如您所看到的,size_b或任何除以零会将1/0设置为ZeroDivsionErrorargs,这取决于您的划分方式。