ビジネスクラスのメソッドで発生した例外については、基本的にはtry-catchブロックを使って各メソッド内で例外処理を記述します。 com.fujitsu.uji.Postprocessorインターフェイスをビジネスクラスやセションクラスに実装して使用すると、複数のメソッドで発生する例外の処理を1つのメソッドにまとめて記述できます。 あまり発生しないような例外の処理をまとめて記述したい場合に使用します。
それぞれのビジネスクラスに特有の例外をまとめて処理する方法は次のとおりです。
ビジネスクラスにcom.fujitsu.uji.Postprocessorインターフェイスを実装します。ビジネスクラスをGenericHandlerクラスから継承して作成している場合は、この作業は不要です。GenericHandlerがPostprocessorを実装しているためです。
ビジネスクラスにhandleExceptionメソッドを作成します。
handleExceptionの中に例外処理を記述します。
以上のようにビジネスクラスを作成した場合、ビジネスクラスのメソッドから例外がスローされると、handleExceptionメソッドが呼び出されます。handleExceptionの引数には発生した例外が与えられるため、それを参照して例外処理を実行できます。発生した例外をhandleExceptionで処理できなかった場合は、再度その例外をスローするように処理を作成してください。
ビジネスクラスに共通の例外をまとめて処理する方法は次のとおりです。
ユーザー定義のセションクラスを作成します。作成方法は、“G.4.1 セション管理の基本的な方法を知りたい”を参照してください。
セションクラスにcom.fujitsu.uji.Postprocessorインターフェイスを実装します。
セションクラスにhandleExceptionメソッドを作成します。
handleExceptionの中に例外処理を記述します。
以上のようにセションクラスを作成すると、ビジネスクラスで例外が処理されなかった場合には、セションクラスのhandleExceptionメソッドが呼び出されます。ビジネスクラスのhandleExceptionメソッドの場合と同様に例外を処理してください。
handleExceptionの実装例
public class SampleHandler extends GenericHandler { .... public Object handleException(DispatchContext context, Throwable th) { // 発生した例外がthに渡されます。 if(th instanceof MyException) { // MyExceptionが発生した場合の処理を行ないます。 .... } else { // 処理できない例外はスローします。 throw new com.fujitsu.uji.HandlerException(th.getMessage(),th); } return null; } }
ポイント
一度キャッチした例外を再度スローする場合、そのままスローすると、例外の中のスタックトレース情報が再スローした時点のものに書き換えられます。最初にスローした時点の情報を得るには以下のような方法があります。
新しく例外のインスタンスを作成し、元の例外をラップしてからスローします。上記記述例では、HandlerExceptionにラップしてスローしています。元の例外はHandlerExceptionクラスのgetRootCauseメソッドで取得できます。
ログや標準出力にスタックトレースを出力してから再スローします。
関連項目