2012-12-19 9 views
10

Czy istnieje sposób, w jaki mogę obsłużyć jakikolwiek błąd "catch-all" w aplikacji internetowej Pyramid? W tej chwili zaimplementowałem rejestrowanie wyjątków do bazy danych (za pośrednictwem dokumentów pod numerem http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html), a ja zwrócę wiadomości do moich widoków, aby umieścić "przyjazną" twarz na tym, co się stało.Obsługa wyjątków typu "catch-all friendly"

Ale czy jest coś, co mogę zaimplementować, aby pokazać coś w rodzaju "Ups, natknąłeś się na problem i my to analizujemy" na wszystko, czego nie zauważam, i mogłem użyć powyższych obsługi błędów za kulisami, aby zalogować się cokolwiek do bazy danych? Albo, czego powinienem szukać w wyszukiwaniach?

Dzięki,

zmieniać na nim, bo nie może się zmieścić to wszystko w komentarzu: . Dzięki, wydaje się dokładnie to, czego szukam!

Jedno biegnę do, ja nie wiem, czy jest to związane lub nie ....

Więc jestem wykonawczych rejestratora SQL jak wyżej tak:

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

Musiałem wyjąć wywołanie "transaction.commit()" i zamiast tego użyć .flush(), ponieważ podczas korzystania z transakcji otrzymałem wyjątek SQLAlchemy DetachedInstanceError. Myślę, że dzieje się tak dlatego, że gram w niektóre gry, przekazując prośbę do funkcji pomocnika i to tam wydaje się, że ją rzuca. Tak więc działa poprzez opróżnianie sesji. Buuuut, co się dzieje, jeśli mam instrukcję log.error() w moim widoku wyjątku, jeśli wyjątek jest faktycznie rzucany, widok go przechwytuje (świetnie!), Ale instrukcja dziennika w widoku nie zostaje zatwierdzona. Dzienniki debugowania w Pyramid pokazują, że są zapisywane, ale nigdy nie zostały zatwierdzone.

Jeśli zmieniam moduł obsługi rejestrowania z powrotem na transaction.commit, to wyjątki zostaną zatwierdzone, ale wróciłem do pierwotnego problemu. Myślę, że muszę skupić się na tym, co robię w mojej funkcji pomocnika, która to powoduje, ale wciąż uczę się SQLAlchemy w ogóle. Czasami może być trochę dziwnie.

Odpowiedz

10

Możesz ustawić exception view. Na przykład:

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

Oh nice! A to poradziłoby sobie z _any_ wyjątkiem, który się dzieje _wherewhere_ w widoku wywoływalnym, prawda? Zamiast zwracać odpowiedź, mógłbym technicznie po prostu ponownie "wyrzucić exc'? Czy to podejście jest nadal zalecane dzisiaj? – Jens