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.
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