DBUtilsのQueeryクラスのソースにこんなの感じのコードがあった。
public int update(Connection con,String sql,Object[] params) throws SQLException { try { //update処理 } catch(SQLException sqle) { this.rethrow(sqle); } finally { DBUtils.close(conn); } }
SQLExceptionをThrowしてるメソッドで捕まえるってどうなの?throws節が意味を成さない気がする。
Throws書いといてコンパイル時に「やべ、Rethrowしなきゃ」ってアラームをあげてる?まぁそれもある意味Tipsではあるけど、明示的にrethrowを意識させるのはダサい。
それを考えるとStrutsのExceptionHandlerの仕組みはGoodだよなぁ。ExceptionListenerなるものは多分ないから、TemplateMethodでその上でExcpetionをキャッチしてHandlerにRethrowしてんだろな。
こんなイメージを想像してます。
//親クラス
public class Parent {
private Handler handler;
public Object execute(...) {
try {
this.doTask(..);
} catch(Exception hoge) {
handler.rethrow(hoge);
} //....
}
//Template Method
protected abstract List doTask(..) throws Exception;
}
//子クラス
public class Child extends Parent{
protected List doTask(..) throws Exception {
//ここでExeption起きても親がキャッチできる!
}
}
恐らくStrutsもこの作り。HandlerのInjectionをActionServlet#init()辺りでやってるはず。Strutsのソースコードを明日ざっくり見るとするか。*1
*1:そして全然違って打ちのめされるのかなw
