This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Donnerstag, 19. März 2009

Struts2 - Unchecked Exceptions loggen

Oft arbeitet man bei technischen Problemen oder Situation, die im Programmflow nicht vorkommen sollten, mit RuntimeExceptions (unchecked Exceptions). Ein paar Allgemeine Informationen rundum das Thema sind in folgenden Artikel schön dargestellt: http://www.roseindia.net/java/exceptions/exception.shtml.

Unchecked Exceptions müssen somit auch in der Struts Action nicht abgefangen werden. Das Struts Framework verarbeitet in diesem Fall die Exception.

Um in Struts ganz allgemein Exceptions abzufangen kann man in der struts.xml ein global exception mapping definieren. Dabei kann dann noch ein globaler result Typ eingestellt werden:

<global-results>
<result name="error">/WEB-INF/web/jsp/error.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>

Die error.jsp kann dann die Fehlermeldung bspw. wie folgt ausgeben:

...
<h1>ERROR</h1>
<s:actionerror/>
<p>
<s:property value="%{exception.message}"/>
</p>
<hr/>
<h3>Technical Details</h3>
<p>
<font style="font-size: 9px; color:gray">
<s:property value="%{exceptionStack}"/>
</font>
</p>
...

Die Exception wird dann allerdings nur im Client (Browser) dargestellt. Wichtig ist es aber natürlich auch, die Fehlermeldung in Logfiles zu dokumentieren um anschließend eine Ursachenforschung zu betreiben.

Um dies zentral vornehmen zu können bietet sich die globale error.jsp an. Mit folgenden Befehlen wird der Stracktrace mit Hilfe von log4j geloggt.

...
<%@page import="org.apache.log4j.Logger"%>
<s:set name="stackTrace" value="%{exceptionStack}" scope="page"/>
<%
String stackTrace = (String) pageContext.getAttribute("stackTrace");
Logger.getLogger(this.getClass()).error(stackTrace);
%>
...

In Variable exceptionStack auf dem ValueStack hat das Struts Framework den Stacktrace bereits reingeschrieben. Der restliche Code dürfte soweit selbsterklärend sein.

Keine Kommentare:

Kommentar veröffentlichen