GlobalesExceptionHandling
Last changed: Daniel Buchholz

Summary: Globales Exception-Handling mit HttpModules - Anwendungsfälle

Motivation

Jeder Programmierer hat es sicherlich schonmal erlebt. Ein Anwender der Site ruft an und meldet:

In Anwendung XY kam so ne komische Fehlermeldung ... nein, ich hab nix gemacht ... nein, ich weiß nicht mehr was da gemeldet wurde ... reproduzierbar? Hm, ich weiß nicht mehr wie ich da hingekommen bin...

Abhilfe

Um dem geplagten Programmierer auszuhelfen bastelt er sich ein

18.01.2006 12:10:30 - Thomas Bandt
Module mit dem er auftretende Exceptions einerseits etwas freundlicher gestaltet und andererseits sich bei der Gelgenheit auch evtl. gleich per Mail mit den zum Fehlerzeitpunkt verfügbaren Infos zukommen lässt. Dies alles natürlich nur wenn sich weiter unten sonst kein Code für die Exception zuständig fühlt. In der Regel also wahrscheinlich für wirklich unerwartete Dinger.

Dazu wird ein entweder schon verfügbares oder neu anzulegendes Module mit einer Methode bestückt die den aufgetretenen Fehler verarbeitet. Dazu wird sie in der Init-Methode des Module an das Error-Event der Application über

 context.Error

angeklemmt

Dort kann dann über

 HttpContext.Current.Server.GetLastError()

der gerade aufgetretene Fehler ausgelesen werden. Ab hier stehen einem eigentlich alle Möglichkeiten offen, den Fehler weiter zu verarbeiten.

Z.B. kann man sich per Mail die Fehlerdetails zukommen lassen:

Dabei sollte man sich am besten gleich die BaseException ansehen oder aber wenigstens rekursiv die InnerExceptions durchstochern, sonst bekommt man von ASP.NET nur die Info, dass sich niemand für die Exception zusändig fühlte und sie deswegen bis ins Module durchgeflogen ist.

Das Module ist bei der Gelegenheit auch der richtige Ort, dem User eine passendere Fehlermeldung zu präsentieren als die rohe Exception. Man kann ihn etwa darauf hinweisen, dass ein außergewöhnliche Fehlersituation aufgetreten ist und der Hersteller/Programmierer der Site automatisch darüber informiert wurden.

Hierzu lässt man sich das aktuelle Response-Objekt geben...

 HttpContext.Current.Response

Das macht man mit Clear() zunächst platt, für den Fall dass die normalen Klassen schon Ausgaben erzeugt haben. Dann kann man die gewünschten Infos einfügen und mit einem End() ist auch die User-Info erledigt.