2016-08-10 4 views
1

async/awaitの構文を使用した後に、プログラムが正しく機能しなくなっています。しかし例外はありません。たとえば :asnycioの例​​外が遅れたり、まったく表示されないのはなぜですか?

async def my_func(self): 
    async with self.engine() as conn: 
     print('step1') # step1 shows in console 
     await conn.exceute("INSERT INTO bla-bla") 
     print('step2') # I can't watch 'step2', and no any exceptions caughted to console 

しかし、私はtry/except構文の例外を使用する場合catchedすることができます。

async def my_func(self): 
    async with self.engine() as conn: 
     print('step1') # step1 shows in console 
     try: 
      await conn.exceute("INSERT INTO bla-bla") 
     except Exception as e: 
      print_exc() # only by this way I can see whats wrong 
     print('step2') 

Soがキャッチせずにすぐに例外を見ることはできますか?あるいは、私はステップを使用してすべてをデバッグできますか?

+1

環境変数PYTHONASYNCIODEBUG = 1を設定して起動します。 – wim

+0

@wimは役に立ちません(エラーは表示されません)。しかし、コンソール(エラーではない)で多くのデバッグ・トレースバックが表示されるようになりました。 – Broly

+2

文書によれば、それは助けなければならない。 https://docs.python.org/3/library/asyncio-dev.html#detect-exceptions-never-consumed – Petr

答えて

1

例外が発生し、スタックが展開されます。

本当の質問は、コルーチンを実行するために何を使用するのですか?

loop.run_until_complete(my_func())は、予期したとおりに例外を処理します。別の使用シナリオが異なる場合があります。

+0

私は 'loop.create_task(my_func()) 'を使用しました 多分私は' try/except '' my_func() 'の中で一度に? – Broly

+1

作成したタスクのために** fire-and-forget **テクニックは決して行うべきではありません。 'result = await loop.create_task(my_func())'を使用してください。 タスクを待つと、例外が発生します。 タスクの作成と結果の待ち合わせを分割することができますが、タスクの結果をどこかに尋ねる必要があります。 –

+0

プロパティに 'create_task'を使用しました。プロパティに' __aget__'と '__aset__'がありませんので、' await'を使うことはできません。 また、変更後にDBに書き込むために 'list'メソッドと' dict'メソッドのクラス継承者で 'create_task'を使用しました。これはいい練習ですか?それとももっと良い方法がありますか? いずれの場合も、非同期ディスクリプタと割り当てが不足しているため、満たすことができません。 – Broly

関連する問題