2014-03-26 2 views
0

나는 토네이도를 사용하여 휴식 처리기를 만듭니다. 여기에 InvalidRequest, InvalidToken 등과 같은 몇 가지 공통적 인 예외가 있습니다. 그래서 이들을위한 예외 처리기를 어떻게 만들 수 있는지 알고 싶었습니다.함수로 예외 처리기

class RestRegisterHandler(RestHandler): 
@gen.coroutine 
def post(self): 
    self.raw_data = None 
    try: 
     yield self.validate_user() 
     self.raw_data = json_decode(self.request.body) 
     logger.debug(self.raw_data) 
     model_object = self.model(self.raw_data) 
     model_object.validate() 
     logger.debug("Inseting to database") 
     yield model_object.insert(self.db) 
    except InvalidRequest: 
     self.write_error(404, 'Invalid request') 
    except InvalidToken: 
     self.write_error(404, 'Token Validation Failed') 
    except ModelValidationError as error: 
     logger.error("Unknown Validation error: '{0}'".format(error)) 
     raise utils.errors.ValidationError(400, error_messages=error.messages) 
    except DuplicateKeyError: 
     logger.debug("User already exists") 
     self.write_error(404, 'User already exists') 
    except Exception as e: 
     logger.error(e) 
     self.write_error(404, 'Invalid request') 
    else: 
     logger.debug("db saved") 
     self.write("Registered succesfully") 
     return 

뭔가 이런

class RestHandler(): 
    def super_exception(): 
    except InvalidToken: 
     print() 
    except InvalidRequest: 
     print() 
    # the rest of exceptions should be handled by post function 

답변

0

뭔가 같은 예제 코드의 동일한 기능 자체 나머지 .. 파트?

class RestHandler(object): 
    # "default" exception handling in the super class 
    def handle_exception(self, e): 
     logger.error('Default error handling caught a "%s"' % e) 

class RestRegisterHandler(RestHandler): 
    # "specific" exception handling in the child class 
    def handle_exception(self, e): 
     # Just an idea, you can implement this in different ways 
     WRITE_ERROR    = (InvalidRequest, InvalidToken, DuplicateKeyError) 
     WRITE_ERROR_WITH_LOGGER = (Exception,) 
     RAISE_VALIDATION_ERROR = (ModelValidationError,) 

     if e in WRITE_ERROR: 
      self.write_error(404, str(e)) 
     elif e in WRITE_ERROR_WITH_LOGGER: 
      logger.error(e) 
      self.write_error(404, str(e)) 
     elif e in RAISE_VALIDATION_ERROR: 
      logger.error("Unknown Validation error: '{0}'".format(e)) 
      raise utils.errors.ValidationError(400, error_messages=e.messages) 
     else: 
      # if couldn't be handled here, fallback to the default implementation 
      super(RestHandler, self).handle_exception(e)   


    @gen.coroutine 
    def post(self): 
     self.raw_data = None 
     try: 
      yield self.validate_user() 
      self.raw_data = json_decode(self.request.body) 
      logger.debug(self.raw_data) 
      model_object = self.model(self.raw_data) 
      model_object.validate() 
      logger.debug("Inseting to database") 
      yield model_object.insert(self.db) 

     except Exception as e: 
      self.handle_exception(e) 

     else: 
      logger.debug("db saved") 
      self.write("Registered succesfully") 
      return 
0

이에 대한 일반적인 솔루션은 (단지 오류가 핸들러 함수를 탈출하자, 자신 write_error 호출하지 않습니다) RequestHandler.write_error을 무시하는 것입니다. write_errorexc_info 키워드 인수를 사용하여 요청 실패의 원인이 된 예외를 볼 수 있습니다.