Wir haben ein Python-2-Projekt, in dem wir aktiv Coroutinen verwenden. Wir können keine Richtlinien für die Behandlung von Exceptions in Coroutinen finden.Ausnahme auslösen oder gen.Return-Objekt in Tornado-Coroutine zurückgeben
Zum Beispiel, here führen Entwickler von Tornado erwähnt, dass coroutines should never raise an exception
, aber es ist nicht klar, warum. Sieht aus wie dieser Ansatz funktioniert und stark in Tornado.web selbst verwendet:
https://github.com/tornadoweb/tornado/blob/master/demos/blog/blog.py#L180
class AuthCreateHandler(BaseHandler):
def get(self):
self.render("create_author.html")
@gen.coroutine
def post(self):
if self.any_author_exists():
raise tornado.web.HTTPError(400, "author already created")
hashed_password = yield executor.submit(
bcrypt.hashpw, tornado.escape.utf8(self.get_argument("password")),
bcrypt.gensalt())
tornado.web.HTTPError gerade erstreckt Basis Ausnahme Klasse. Auch die Diskussion hier https://github.com/tornadoweb/tornado/issues/759#issuecomment-91817197 schlägt vor, dass das Anheben der Ausnahme in der Coroutine angemessen ist.
Auch here, aktiv Tornado Beitrag schlägt vor, dass Ausnahmen Erhöhung in Ordnung ist:
class PostHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self, slug):
post = yield db.posts.find_one({'slug': slug})
if not post:
raise tornado.web.HTTPError(404)
self.render('post.html', post=post)
Gibt es irgendwelche Nachteile zu Ausnahmen innerhalb Tornado Koroutinen Anheben oder sollten wir raise gen.Return(exception_object)
?