繁体   English   中英

python如何在块例外情况下捕获自定义异常?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM