2017-05-12 4 views
0

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)?

Antwort

4

Verwenden Sie in Python 2 nur raise gen.Return(value), um einen normalen Wert zurückzugeben und keine Ausnahme auszulösen. Es entspricht genau return value in einer Coroutine in Python 3.

Um eine Ausnahme von einer Coroutine auszulösen, ist eine normale raise Exception() korrekt. Das Wunderbare an Coroutinen ist ihre Ausnahmebehandlungssemantik, die ziemlich genau mit regulären Funktionen übereinstimmt.

3

Das Erhöhen von Ausnahmen innerhalb von Routinen ist völlig normal. Wenn ich sagte, dass "Coroutines nie eine Ausnahme auslösen sollte" bezog ich mich darauf, was passiert, wenn Sie eine Coroutine ohne yield oder await aufrufen: Die Ausnahme wird erfasst und gehalten, bis der Rückgabewert der Coroutine entweder yielded oder awaited ist.

Verwandte Themen