1
#some code

@tornado.gen.engine
def do_insert():
    result = yield motor.Op(db.test_collection.insert, {'_id': 1})

try:
    do_insert()
except:
    print "error"

#some code

このようなコードを試しました。データベースはmongodbです。初めて実行すると、データが正しく挿入されます。2回目に実行すると、例外が発生し、「エラー」が出力されます。しかし、印刷「エラー」の代わりにクラッシュしました。

4

2 に答える 2

1

do_insert非同期関数です。これは、それを呼び出すと何らかのタスクが開始されることを意味しますが、すぐには終了せず、返されるまでに終了していない可能性があります。結果 (何かが返された場合) または例外 (失敗した場合) を確認するには、終了するまで待つ必要があります。これは通常、呼び出しサイトでも「利回り」が必要であることを意味します (スタックのずっと上まで同様です)。最上位では、IOLoop を実行する必要があります。バッチ スタイルのアプリケーションでは、おそらく IOLoop.run_sync を使用する必要があります。長時間稼働するサーバーでは、代わりに IOLoop.start を使用します。あなたの例は次のようになります (gen.engine の代わりに gen.coroutine を使用していることに注意してください。これは run_sync でうまく機能します):

@tornado.gen.coroutine
def do_insert():
    result = yield motor.Op(db.test_collection.insert, {'_id': 1})

try:
    IOLoop.instance().run_sync(do_insert())
except:
    print "error"
于 2013-11-03T19:31:32.123 に答える
0

I catch the error within the wrapped inserting method and it works for me:

@tornado.gen.engine
def do_insert():
    try:
        result = yield motor.Op(db.test_collection.insert, {'_id': 1})
    except:
        <you should log here>
于 2014-02-19T19:15:45.180 に答える