如何解决如何在gen.Task中捕获异常?
我使用的是python 2.7,龙卷风4.5
以下代码不起作用:except块不会被触发。我不明白为什么?
@gen.coroutine
def co_do_thing():
yield gen.Task(do_thing)
def do_thing(callback):
try:
a,b = ...
result = maybe_throw(a,b,callback)
except Exception as e:
# this block is not called
if a:
raise ApiError("called with A")
elif b:
raise ApiError("called with B")
else:
raise e
def maybe_throw(arg1,arg2,callback):
if random.random() < 0.5:
raise AssertionError("yikes")
callback("done")
相反,我可以在对co_do_thing
的调用周围的gen.Task
中捕获异常;但那时我没有如何称呼maybe_throw
的上下文。就我而言,maybe_throw
提出一个较低级别的异常,并根据输入将调用者将其转换为人类可读的错误更有意义。
我是否只需要重构它即可在较低级别调用gen.Task?那会很烦:/
解决方法
在我测试它似乎可以正常工作时,引发了一个异常。下面是简单的测试套件:
import q # q.py is the file with question's code
import unittest
from mock import patch,Mock
from tornado.testing import gen_test,AsyncTestCase
class MyTest(AsyncTestCase):
def setUp(self):
self.mock_random = patch('q.random').start()
AsyncTestCase.setUp(self)
def tearDown(self):
AsyncTestCase.tearDown(self)
patch.stopall()
@gen_test
def test_no_error(self):
self.mock_random.return_value = 0.7
res = yield q.co_do_thing()
self.assertEqual(res,'done')
@gen_test
def test_exception(self):
self.mock_random.return_value = 0.1
with self.assertRaises(Exception) as ctx:
yield q.co_do_thing()
self.assertEqual(ctx.exception.message,'called with A')
if __name__ == '__main__':
unittest.main()
测试通过:
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
这是q.py
,我添加了return语句对其进行测试。
from random import random
from tornado import gen
@gen.coroutine
def co_do_thing():
res = yield gen.Task(do_thing)
# added: to enable to test it meaningfully
raise gen.Return(res)
def do_thing(callback):
try:
a,b = 22,33
result = maybe_throw(a,b,callback)
except Exception as e:
if a:
raise Exception("called with A")
elif b:
raise Exception("called with B")
else:
raise e
def maybe_throw(arg1,arg2,callback):
if random() < 0.5:
raise AssertionError("yikes")
callback("done")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。