loop.call_exception_handler(context)有什么用

时间:2019-12-25 16:39:52

标签: python-asyncio

请帮助提供一个loop.call_exception_handler(context)用法示例,并带有asyncio中的示例。当loop.get_exception_handler()已经存在时,为什么有人需要显式调用异常处理程序。同样,如果未设置loop.get_exception_handler(),那么loop.call_exception_handler(context)调用该怎么做。

1 个答案:

答案 0 :(得分:0)

call_exception_handler是一种便捷函数,它封装了调用自定义异常处理程序或默认异常处理程序,以及如果自定义程序本身失败则回退到默认异常处理程序的逻辑。它被设计为从遇到异常但没有“调用方”将其传播到的代码中调用。例如:

  • 实现call_sooncall_later的句柄在调用提供的函数并捕获call_exception_handler时捕获异常。

  • 在循环中调用accept的事件循环代码的服务器部分使用call_exception_handler报告accept引发的异常。它无法将异常传播给其调用者,因为它正在后台任务中运行,因此它没有调用者。

  • 各种传输方式都使用call_exception_handler报告错误。

  

当loop.get_exception_handler()已经存在时,为什么有人需要显式调用异常处理程序。

因为get_exception_handler()仅调用自定义异常处理程序,如果已设置。如果未设置,则返回默认的异常处理程序。如果设置了一个,并且引发了异常,则默认的异常处理程序将用于报告那个异常。并且SystemExitKeyboardInterrupt之类的错误会被仔细忽略。在需要调用异常处理程序的每个位置重复此逻辑既繁琐又容易出错,因此创建了call_exception_handler