GoTheDistance

ござ先輩と言われています。(株) クオリティスタートという会社をやっています。

Throwして即キャッチ?

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