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