それは奇妙なことです。私はトップレベルを使用し、反対の動作を期待しています。そしてそれが私が観察していることです。この質問への最初の回答から何か変更がありましたか?ドキュメントが言うように:
これにより、リクエストを送信し、結果を気にする必要がなくなります。
次の単体テストを試すことができます(テストベッドを使用)。
@ndb.tasklet
def raiseSomething():
yield ndb.Key('foo','bar').get_async()
raise Exception()
@ndb.toplevel
def callRaiseSomething():
future = raiseSomething()
return "hello"
response = callRaiseSomething()
self.assertEqual(response, "hello")
このテストは合格です。NDBは警告をログに記録します:「中断されたジェネレータraiseSomething(tests.py:90)はException()を発生させました」が、例外を再発生させません。
ndb.toplevelはRPCを待機するだけで、実際の結果は何もしません。装飾された関数自体がタスクレットの場合、最初にget_result()を呼び出します。この時点で、例外が発生します。次に、残りの「孤立した」RPCを待機し、例外が発生した場合にのみログに記録します。
だから私の応答は次のとおりです:リクエストは成功します(200を返します)