Struts2例外処理
どうもうまくいかないケースがあるなと思ったら、OGNL => アクションのゲッタに来た時に、ぬるぽとか投げると、OgnlValueStackの中のfindValue(String, Class)で飲み込まれてしまうことが分かった。
} catch (Exception e) {
logLookupFailure(expr, e);
return findInContext(expr);
} finally {
ここで飲まれちゃうと、exception handlerに渡らないから、例外処理ハンドラが起動しないし、open session in viewパターンを使いたい時に上位側で例外を監視してcommit/rollbackなんかしていると、例外が来ないもんだから、間違ってcommitしちゃって、えらいことになる。まぁ良くあるExceptionのcatchバグパターンだから、RuntimeExceptionのcatch節を追加してみたのだけど、
} catch (RuntimeException e) {
logLookupFailure(expr, e);
throw e;
} catch (Exception e) {
logLookupFailure(expr, e);
return findInContext(expr);
} finally {
まぁ確かに、これで上位層に例外が渡るようになって、うまくいくんだけど、どうもリザルトが二度実行されることになるのが、まずいようで、ブラウザにStream closedというメッセージと共にスタックトレースが表示される。ぬるぽなのに「Stream closed」じゃ、わけ分からんよなぁ。一応Struts2のMLに投げてみた。





