Discuss / Python / 内置异常文档中的:raise new_exc from original_exc

内置异常文档中的:raise new_exc from original_exc

Topic source

一盒噪噪

#1 Created at ... [Delete] [Delete and Lock User]

关于raise:   抛出①当前异常 ②后跟异常 给上级调用者            (即使当前异常和后跟异常是相同的,也会抛出两个)

(当引发异常,当前异常/最后一个异常会自动存储在异常类的__cause__变量中,raise语句会抛出这个变量)

解决方法是调用下面的语句,把当前异常赋值给raise后的语句 

raise new_exc from original_exc

# new_exc 自定义异常

# original_exc  原始异常

例:

def foo(s):
	try:
		n = int(s)
		r=10/n
	except ZeroDivisionError as e:
		raise FooError(e) from ZeroDivisionError

输出:

ZeroDivisionError               #标出原始异常

The above exception was the direct cause of the following exception:            #上述异常直接导致了如下异常

Traceback (most recent call last):
  File "<pyshell#77>", line 1, in <module>
    foo(0)
  File "<pyshell#76>", line 6, in foo
    raise FooError(e) from ZeroDivisionError
FooError: division by zero

注意:

你可以直接写:

raise FooError from ZeroDivisionError     #去掉(e)

这是python3新改的语法: raise MyException('error message')                 # 括号里是异常原因 

在python2中是这样的:raise MyException,'error message'

所以FooError(e)  并不是调用FooEorror类的意思

异常原因可以有多个,在输出异常的时候会依次打印,并且如果有两个及以上的话,会附带上异常名称(基类)

如下:

raise FooError(e,e) from ZeroDivisionError

    输出:(对比一下上面的异常,一目了然)

FooError: (ZeroDivisionError('division by zero'), ZeroDivisionError('division by zero'))raise FooError(e)

谁导致了异常:

raise FooError('%s'%s)

输出:

FooError: 0

ps:异常对象无法在异常块作用域外访问

一盒噪噪

#2 Created at ... [Delete] [Delete and Lock User]

异常类中的with_traceback函数

可以设置回溯


  • 1

Reply