ビジネスクラスで発生する例外に対して細かく制御を行うためにはtry-catchブロックを使用します。
public void startup(DispatchContext context) {
dm = new DataManager();
try {
dm.prepareData();
} catch(DataManagerException e) {
// 例外に応じた画面を表示するためのsetResponseBean
....
} catch(IOException e) {
// 例外に応じた画面を表示するためのsetResponseBean
....
}
....
}Apcoordinatorでは、Postprocessorインタフェースを使って、あまり発生しないような例外をまとめて処理することができます。ビジネスクラス、セションクラス、アプリケーションクラスでPostprocessorインタフェースを実装すると、処理中に例外が発生した場合にhandleExceptionメソッドが呼ばれます。その例外に対応可能ならば対応して正常終了、対応不可能ならば再度その例外をスローします。 handleExceptionメソッドは、ビジネスクラスの外で発生した例外も受け取る可能性があります。そのため、例外に対応可能かどうか判定し、対応不可能な例外は再度スローする必要があります。
public class SampleHandler extends GenericHandler
implements com.fujitsu.uji.Postprocessor
{
public Object handleException(DispatchContext context, Throwable th) {
if(th instanceof MyException) {
// 例外に応じた画面を表示するsetResponseBean
....
} else {
// 不明な例外
throw th;
}
return null;
}
}注意
ダウンロードサーブレットを使用するWebアプリケーションの場合、handleExceptionメソッドの復帰値に、エラー等を表示するための画面のJSPファイル名(String)を返す必要があります。詳細は“17.2 バイナリファイルの送受信”を参照してください。
例外は発生時の形のままではなく、NestedExceptionに変換されて通知されることがあります。 NestedException形式の例外はgetRootCauseメソッドにより、原因の例外を知ることができます。
import com.fujitsu.uji.log.NestedException;
....
public Object handleException(DispatchContext context, Throwable th) {
while(th instanceof NestedException) {
th = ((NestedException)th).getRootCause();
}
// thは原因の例外
....
}
....ポイント
Webアプリケーションの場合、handleExceptionメソッドに引数として渡されるDispatchContextオブジェクトのsetResponseBeanメソッドを使用することで、例外に応じた画面に遷移することが可能です。