请帮助提供一个loop.call_exception_handler(context)用法示例,并带有asyncio中的示例。当loop.get_exception_handler()已经存在时,为什么有人需要显式调用异常处理程序。同样,如果未设置loop.get_exception_handler(),那么loop.call_exception_handler(context)调用该怎么做。
答案 0 :(得分:0)
call_exception_handler
是一种便捷函数,它封装了调用自定义异常处理程序或默认异常处理程序,以及如果自定义程序本身失败则回退到默认异常处理程序的逻辑。它被设计为从遇到异常但没有“调用方”将其传播到的代码中调用。例如:
实现call_soon
和call_later
的句柄在调用提供的函数并捕获call_exception_handler
时捕获异常。
在循环中调用accept
的事件循环代码的服务器部分使用call_exception_handler
报告accept
引发的异常。它无法将异常传播给其调用者,因为它正在后台任务中运行,因此它没有调用者。
各种传输方式都使用call_exception_handler
报告错误。
当loop.get_exception_handler()已经存在时,为什么有人需要显式调用异常处理程序。
因为get_exception_handler()
仅调用自定义异常处理程序,如果已设置。如果未设置,则返回默认的异常处理程序。如果设置了一个,并且引发了异常,则默认的异常处理程序将用于报告那个异常。并且SystemExit
和KeyboardInterrupt
之类的错误会被仔细忽略。在需要调用异常处理程序的每个位置重复此逻辑既繁琐又容易出错,因此创建了call_exception_handler
。