[英]How does python catch custom exceptions in except block cases?
假设我有以下自定义异常。
class CustomException(TypeError):
def __init__(message, code):
super().__init__(f'{code}: message')
self.code = code
python如何在以下代码中知道何时捕获我的异常?
try:
x = doSomething(a, b, c)
except CustomException:
raise
当我实现doSomething()
函数时,是否必须显式抛出CustomException
以使其被捕获? 就像,对于内置的异常类,代码可以抛出诸如KeyError之类的异常,并且我们在使用字典进行操作时不必显式地声明raise KeyError
。
任何引发异常的代码都明确地这样做,包括KeyError
。 与内置类型相比,自定义异常不需要特殊处理。 try...except
仅可在try
内任何语句执行的代码引发异常的情况下捕获该异常。 这包括任何其他函数调用,这些调用链接在一起成为一个调用堆栈。
在下面的例子中
>>> d = {}
>>> d['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'foo'
KeyError
并非一无是处,Python dict
实现显式引发了该异常。 这可能并不总是很明显,因为本机代码(此处是用C实现的代码)未显示在Python追溯中。
对于d[...]
订阅操作, dict_subscript()
函数调用_PyErr_SetKeyError(key);
,这是一个使用PyErr_SetObject()
的帮助程序函数, PyErr_SetObject()
的C语言等效于raise
引发KeyError(key)
异常的raise。
捕获异常对于所有异常类型都相同,自定义异常在此并不特殊。 引发异常时,正常的代码流被中断,并且取消调用堆栈,直到遇到活动的try
语句为止,然后按照源代码中定义的顺序使用isinstance(active_exception, ExceptionClassBeingHandled)
测试任何异常处理程序。
如果没有异常捕获到异常,Python将继续展开调用堆栈,直到到达最后一个堆栈帧为止,此时如果没有异常捕获到异常,Python将退出并带有堆栈跟踪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.