2017-05-12 6 views
0

우리는 코 루틴을 적극적으로 사용하는 Python 2 프로젝트를 가지고 있습니다. 우리는 coroutine 내부 처리 예외에 대한 지침을 찾을 수 없습니다.토네이도 코 루틴에서 예외를 발생 시키거나 gen.Return 객체를 반환합니다.

예를 들어 here의 토네이도 개발자는 coroutines should never raise an exception을 언급했지만 그 이유는 분명하지 않습니다. 이 방법은 작품과 크게 Tornado.web 자체에 사용되는 것 같은데 :

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은 기본 예외 클래스 확장합니다. 또한, 여기 https://github.com/tornadoweb/tornado/issues/759#issuecomment-91817197에 대한 설명은 코 루틴 내부에서 예외를 발생시키는 것이 적절하다고 제안합니다.

또한 here, 활성 토네이도 기여 예외를 제기하는 것은 괜찮 제안 :

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) 

가 토네이도 코 루틴 내에서 예외를 높이는데 거기에 어떤 단점인가, 아니면해야 우리 raise gen.Return(exception_object)?

답변

4

파이썬 2에서는 예외를 발생시키지 않고 일반적인 값을 반환하기 위해서만 raise gen.Return(value)을 사용하십시오. Python 3의 코 루틴에서 정확히 return value과 같습니다.

코 루틴에서 예외를 발생 시키려면 보통 raise Exception()이 올 바릅니다. 코 루틴에 대한 놀라운 점은 예외 처리 의미론이 정규 함수와 거의 동일하다는 것입니다.

3

코 루틴 안의 예외 발생은 완벽하게 정상입니다. "coroutines는 예외를 발생 시켜서는 안됩니다"라고 말했을 때 yield 또는 await이없는 코 루틴을으로 호출하면 예외가 캡처되고 coroutine의 반환 값이 yielded 또는 awaited이 될 때까지 유지됩니다.

관련 문제