Was ist der einfachste Weg, um von der Ausnahmeprotokollierung zur Ausnahmebehandlung in einer Spring MVC App zu wechseln?

8

Meine Spring MVC App ist voll von Methoden, die wie folgt aussehen:

%Vor%

Ausnahmen werden abgefangen und protokolliert, aber nicht anders behandelt.

Das oben genannte fooService macht das gleiche und wirft niemals Ausnahmen auf den Controller, sondern fängt sie ab und protokolliert sie. Also wird dieser Controller-Ausnahmecode niemals aufgerufen.

Was ist der beste und einfachste Ansatz zum Implementieren der ordnungsgemäßen Ausnahmebehandlung in meiner App?

    
Peachy 03.07.2011, 19:55
quelle

1 Antwort

9

Befreien Sie sich von allen catch -Anweisungen, wenn sie sich nur unachtsam anmelden. catch soll den Fehler behandeln, nicht verstecken.

Sobald alle diese Fänge entfernt wurden, installieren Sie einen globalen Ausnahme-Resolver in Spring MVC ( 1 , 2 , 3 , ...) Implementieren Sie einfach diese triviale Schnittstelle:

%Vor%

In Ihrem Exception-Resolver protokollieren Sie die Exception einfach einmal und lassen sie als unverarbeitet ablaufen (return null ), so dass Fehlerzuordnungen in web.xml die Anfrage an die richtige Fehlerseite weiterleiten. Oder Sie können die Ausnahme selbst behandeln und eine Fehlerseite ausgeben. AFAIK im einfachsten Fall gibt es keine Notwendigkeit für Register Ausnahme Resolver, nur definieren Sie es als Spring Bean / Annotate mit @Service .

Denken Sie daran, fangen Sie die Ausnahme nur, wenn Sie wissen, was zu tun ist. Die Protokollierung dient nur der Fehlersuche, sie behandelt nichts.

Übrigens:

%Vor%

ist nicht nur eine sehr schlechte Ausnahmebehandlung, sondern auch etwas falsch. Wenn Ihre Ausnahme keine Nachricht enthält, werden Sie vor dem Stack-Trace mysteriöse null sehen. Wenn dies der Fall ist, wird die Nachricht zweimal angezeigt (getestet mit Logback):

%Vor%

... manchmal unerwünscht, besonders wenn die Ausnahmebedingungsnachricht sehr lang ist.

UPDATE : Wenn Sie einen eigenen Ausnahme-Logger schreiben, sollten Sie sowohl org.springframework.web.servlet.HandlerExceptionResolver als auch org.springframework.core.Ordered implementieren. Das getOrder() sollte etwas Kleines zurückgeben (wie 0 ), so dass Ihr Handler Vorrang vor integrierten Handlern hat.

Es ist mir einfach passiert, dass org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver , das vor meinem Handler lief, HTTP 500 ohne protokollieren der Ausnahme zurückgegeben hat.

    
Tomasz Nurkiewicz 03.07.2011, 20:47
quelle