在Python中,協(xié)程(coroutine)是一種特殊的函數(shù),可以在執(zhí)行過程中暫停和恢復(fù)。處理協(xié)程中的異常與處理普通函數(shù)的異常類似,但有一些不同之處。當(dāng)協(xié)程中發(fā)生異常時(shí),它會(huì)被捕獲并存儲(chǔ)在協(xié)程對(duì)象的_exception
屬性中。要處理協(xié)程中的異常,可以使用asyncio.gather()
函數(shù),它會(huì)收集多個(gè)協(xié)程的結(jié)果,并將它們迭代器返回。如果在協(xié)程中發(fā)生異常,asyncio.gather()
會(huì)立即停止執(zhí)行其他協(xié)程,并將異常傳遞給return_exceptions
參數(shù)指定的回調(diào)函數(shù)。
下面是一個(gè)處理協(xié)程異常的示例:
import asyncio
async def raise_exception():
raise ValueError("An error occurred in the coroutine")
async def handle_exception(task):
try:
await task
except Exception as e:
print(f"Caught exception: {e}")
async def main():
task1 = asyncio.create_task(raise_exception())
task2 = asyncio.create_task(asyncio.sleep(1)) # This will not raise an exception
results = await asyncio.gather(task1, task2, return_exceptions=True)
for result in results:
if isinstance(result, Exception):
handle_exception(result)
else:
print(f"Result: {result}")
asyncio.run(main())
在這個(gè)示例中,我們定義了一個(gè)名為raise_exception
的協(xié)程,它會(huì)引發(fā)一個(gè)ValueError
異常。我們還定義了一個(gè)名為handle_exception
的協(xié)程,用于處理異常。在main
協(xié)程中,我們使用asyncio.gather()
函數(shù)執(zhí)行raise_exception
和asyncio.sleep(1)
協(xié)程。我們將return_exceptions
參數(shù)設(shè)置為True
,以便在發(fā)生異常時(shí)將它們傳遞給handle_exception
協(xié)程。最后,我們遍歷results
列表,并根據(jù)結(jié)果類型調(diào)用相應(yīng)的處理函數(shù)。