2012-12-19 2 views
10

피라미드 웹 앱에서 일종의 "포괄적 인"오류 처리를 처리 할 수있는 방법이 있습니까? 현재 예외 로깅을 데이터베이스 (http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html에있는 문서를 통해)에 구현했으며 내보기에 메시지를 보내서 발생한 일에 "친숙한"얼굴을 표시합니다.피라미드 친화적 인 예외 처리

하지만 뭔가 포괄적 인 "죄송합니다, 문제가 발생하여 조사 중입니다"라고 표시 할 수있는 구현 방법이 있습니다. 명시 적으로 잡는 것이 아닌 다른 것에 대해서는 위의 내용을 사용할 수 있습니다. 오류 처리기는 데이터베이스에 무엇이든지 기록합니다. 또는 검색에서 어떤 종류의 것을 찾아야합니까?

감사합니다, 내가 코멘트에 모두 맞지 않을 수 있기 때문에

편집 : . 고마워, 그게 정확히 내가 원하는 것 같다! 이 관련 또는 있지 않다면 내가 실행 해요

한 가지, 내가

그래서 나는과 같이 위와 같이 SQL 로거를 구현하고 있습니다 .... 모르는 :

class SQLAlchemyHandler(logging.Handler): 
    # A very basic logger that commits a LogRecord to the SQL Db 
    def emit(self, record): 
     trace = None 
     exc = record.__dict__['exc_info'] 
     if exc: 
      trace = traceback.format_exc(exc) 
     log = Log(
      logger=record.__dict__['name'], 
      level=record.__dict__['levelname'], 
      trace=trace, 
      msg=record.__dict__['msg'],) 
     DBSession.add(log) 
     DBSession.flush() 
     #transaction.commit() 

트랜잭션을 사용할 때 SQLAlchemy DetachedInstanceError 예외가 발생했기 때문에 'transaction.commit()'호출을 꺼내서 대신 .flush()를 사용해야했습니다. 내가 도우미 함수에 요청을 전달하여 일부 게임을하고 있기 때문에 그게 던져 버릴 것 같아요. 따라서 세션을 비우는 방식으로 작동합니다. Buuuut, 내 예외보기에 log.error() 문이 있으면 예외가 실제로 throw되고보기가 멋지지만보기의 로그 문이 커밋되지 않습니다. Pyramid의 디버깅 로그는 작성되었지만 커밋 된 적이 없음을 보여줍니다.

로깅 처리기를 다시 transaction.commit으로 변경하면 이됩니다.하지만 원래의 문제는 다시 돌아 왔습니다. 나는 내가 처음에 그것을 일으키는 도우미 함수에서하고있는 것에 초점을 맞춰야한다고 생각하지만, 여전히 SQLAlchemy를 일반적으로 배우고있다. 때때로 그것은 조금 이상 할 수 있습니다.

답변

10

exception view을 설정할 수 있습니다. 예 :

@view_config(context=Exception) 
def error_view(exc, request): 
    #log or do other stuff to exc... 
    return Response("Sorry there was an error") 
+0

오 멋지다! 그리고 이것은 callable, correct 뷰에서 _anywhere_ 발생하는 _any_ 예외를 처리 할 수 ​​있습니까? 응답을 반환하는 대신, 기술적으로 '다시 시도'할 수 있습니까? 이 접근법은 오늘날에도 여전히 권장되고 있습니까? – Jens