Pythonでの非同期例外処理

ユーリー・バイダ:

次のコードを使用asyncioaiohttpて、非同期HTTPリクエストを作成します。

import sys
import asyncio
import aiohttp

@asyncio.coroutine
def get(url):
    try:
        print('GET %s' % url)
        resp = yield from aiohttp.request('GET', url)
    except Exception as e:
        raise Exception("%s has error '%s'" % (url, e))
    else:
        if resp.status >= 400:
            raise Exception("%s has error '%s: %s'" % (url, resp.status, resp.reason))

    return (yield from resp.text())

@asyncio.coroutine
def fill_data(run):
    url = 'http://www.google.com/%s' % run['name']
    run['data'] = yield from get(url)

def get_runs():
    runs = [ {'name': 'one'}, {'name': 'two'} ]
    loop = asyncio.get_event_loop()
    task = asyncio.wait([fill_data(r) for r in runs])
    loop.run_until_complete(task)   
    return runs

try:
    get_runs()
except Exception as e:
    print(repr(e))
    sys.exit(1)

何らかの理由で、get関数内で発生した例外はキャッチされません。

Future/Task exception was never retrieved
Traceback (most recent call last):
  File "site-packages/asyncio/tasks.py", line 236, in _step
    result = coro.send(value)
  File "mwe.py", line 25, in fill_data
    run['data'] = yield from get(url)
  File "mwe.py", line 17, in get
    raise Exception("%s has error '%s: %s'" % (url, resp.status, resp.reason))
Exception: http://www.google.com/two has error '404: Not Found'

では、クールーチンによって発生した例外を処理する正しい方法は何ですか?

ダメージ:

asyncio.waitFutures渡されたものを実際に消費するのではなく、完了するのを待ってからFutureオブジェクトを返します。

コルーチン asyncio.wait(futures, *, loop=None, timeout=None, return_when=ALL_COMPLETED)

シーケンスfuturesによって指定されたFuturesとコルーチンオブジェクトが完了するのを待ちます。コルーチンはタスクにラップされます。Future(完了、保留中)の2つのセットを返します

リストyield from内のアイテムを実際に使用するまでdone、それらは未使用のままになります。プログラムはフューチャーを消費せずに終了するため、「例外は取得されませんでした」というメッセージが表示されます。

あなたのユースケースでは、asyncio.gather実際にそれぞれを消費しFutureFutureすべての結果を集約した単一返す(またはException入力リストでフューチャーによってスローされた最初のものが発生する)を使用する方がおそらく理にかなっています

def get_runs():
    runs = [ {'name': 'one'}, {'name': 'two'} ]
    loop = asyncio.get_event_loop()
    tasks = asyncio.gather(*[fill_data(r) for r in runs])
    loop.run_until_complete(tasks)
    return runs

出力:

GET http://www.google.com/two
GET http://www.google.com/one
Exception("http://www.google.com/one has error '404: Not Found'",)

フューチャのasyncio.gather1つが例外を発生させたときに実際にその動作をカスタマイズできることに注意してくださいデフォルトの動作では、最初に発生した例外が発生しますが、出力リストで各例外オブジェクトを返すこともできます。

asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)

指定されたコルーチンオブジェクトまたは先物からフューチャーアグリゲーション結果を返します。

すべての先物は同じイベントループを共有する必要があります。すべてのタスクが正常に完了した場合、返されるfutureの結果は結果のリストです(元のシーケンスの順序で、必ずしも結果の到着順ではありません)。場合return_exceptionsTrue、作業中の例外が成功した結果と同じように扱われ、結果リストに集まっています。それ以外の場合、最初に発生した例外は、返されたフューチャーにすぐに伝達されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非同期例外の処理

分類Dev

JSPでの非同期処理

分類Dev

モノ非同期例外処理

分類Dev

Python非同期タスクで未処理の例外が発生した後の片付け

分類Dev

Nodejsでの非同期の処理

分類Dev

Javascriptでの非同期関数の処理

分類Dev

NodeJS での非同期 URL 解析の処理

分類Dev

C#での非同期画像処理

分類Dev

C#での非同期処理

分類Dev

Pythonでの例外の処理

分類Dev

bluebirdpromiseを使用した非同期例外処理

分類Dev

非同期ブロックJava内の例外を処理する方法

分類Dev

例外-非同期プログラミングの処理

分類Dev

Pythonでの「中古」例外処理

分類Dev

非同期アクションのタスクで例外を処理する場所はどこですか?

分類Dev

RxJava2:retryWhenを使用して非同期コールバックの例外を処理できません

分類Dev

イベント駆動型非同期WCFサービス呼び出しでの例外処理

分類Dev

未処理の例外ハンドラーで非同期にファイルを書き込む

分類Dev

Python処理の例外

分類Dev

非同期並列タスクからの複数の例外の処理

分類Dev

追加の例外処理を伴う非同期Task <T>のタイムアウト

分類Dev

非同期ループでタイムアウト例外を処理する

分類Dev

DeleteDocumentAsyncの呼び出し中に非同期例外を処理する方法

分類Dev

DeleteDocumentAsyncの呼び出し中に非同期例外を処理する方法

分類Dev

Xamarin.Android: 非同期タスクが未処理の例外をスローする

分類Dev

例外内での例外処理

分類Dev

サーブレットからのJavaでの非同期処理

分類Dev

Java webappでのリクエストの非同期処理

分類Dev

nodejsでの非同期データベースの処理

Related 関連記事

  1. 1

    非同期例外の処理

  2. 2

    JSPでの非同期処理

  3. 3

    モノ非同期例外処理

  4. 4

    Python非同期タスクで未処理の例外が発生した後の片付け

  5. 5

    Nodejsでの非同期の処理

  6. 6

    Javascriptでの非同期関数の処理

  7. 7

    NodeJS での非同期 URL 解析の処理

  8. 8

    C#での非同期画像処理

  9. 9

    C#での非同期処理

  10. 10

    Pythonでの例外の処理

  11. 11

    bluebirdpromiseを使用した非同期例外処理

  12. 12

    非同期ブロックJava内の例外を処理する方法

  13. 13

    例外-非同期プログラミングの処理

  14. 14

    Pythonでの「中古」例外処理

  15. 15

    非同期アクションのタスクで例外を処理する場所はどこですか?

  16. 16

    RxJava2:retryWhenを使用して非同期コールバックの例外を処理できません

  17. 17

    イベント駆動型非同期WCFサービス呼び出しでの例外処理

  18. 18

    未処理の例外ハンドラーで非同期にファイルを書き込む

  19. 19

    Python処理の例外

  20. 20

    非同期並列タスクからの複数の例外の処理

  21. 21

    追加の例外処理を伴う非同期Task <T>のタイムアウト

  22. 22

    非同期ループでタイムアウト例外を処理する

  23. 23

    DeleteDocumentAsyncの呼び出し中に非同期例外を処理する方法

  24. 24

    DeleteDocumentAsyncの呼び出し中に非同期例外を処理する方法

  25. 25

    Xamarin.Android: 非同期タスクが未処理の例外をスローする

  26. 26

    例外内での例外処理

  27. 27

    サーブレットからのJavaでの非同期処理

  28. 28

    Java webappでのリクエストの非同期処理

  29. 29

    nodejsでの非同期データベースの処理

ホットタグ

アーカイブ