欢迎访问宙启技术站
智能推送

Python中的CancelledError()异常如何处理

发布时间:2023-12-24 12:32:37

在Python中,CancelledError是一个通常用于异步编程中的异常类。它指示一个操作被取消或中止,通常是因为使用了取消协议(cancellation protocol)。CancelledErrorBaseException的子类,而不是Exception的子类,这意味着它在异常继承层次结构中位于更高的位置。

在异步编程中,特别是使用asyncio库时,常常会遇到需要取消长时间运行的操作的情况。例如,当用户点击“取消”按钮时,您可能需要取消一个正在进行的网络请求或计算任务。

以下是一些处理CancelledError异常的方法:

1. 使用try-except块捕获CancelledError异常并进行处理:

import asyncio

async def long_running_task():
    try:
        # 长时间运行的操作
        await asyncio.sleep(5)
        print("任务完成")
    except asyncio.CancelledError:
        print("任务被取消")

async def main():
    task = asyncio.create_task(long_running_task())
    await asyncio.sleep(2)
    task.cancel()

asyncio.run(main())

在上面的示例中,long_running_task函数是一个模拟的长时间运行的任务。在main函数中,我们使用asyncio.create_task创建一个异步任务,并在两秒后调用task.cancel()来取消任务。在long_running_task函数中,我们使用try-except块捕获CancelledError异常,并在异常处理块中执行适当的操作。

2. 使用asyncio.shield函数保护代码块,使其不被取消:

import asyncio

async def long_running_task():
    try:
        # 使用asyncio.shield保护代码块,使其不被取消
        await asyncio.shield(asyncio.sleep(5))
        print("任务完成")
    except asyncio.CancelledError:
        print("任务被取消")

async def main():
    task = asyncio.create_task(long_running_task())
    await asyncio.sleep(2)
    task.cancel()

asyncio.run(main())

在上面的示例中,我们使用asyncio.shield函数保护了await asyncio.sleep(5)这一代码块,使其不会被取消。这意味着即使在调用task.cancel()后,仍然会执行await asyncio.sleep(5),并在任务完成后打印"任务完成"。

总结一下,处理CancelledError异常通常可以使用try-except块来捕获并执行相应的操作。此外,您还可以使用asyncio.shield函数来保护代码块,使其不被取消。这些示例提供了一些基本的处理CancelledError异常的方法,但具体的处理方式可能会因具体的应用场景而有所不同。