CB3 - チュートリアル 第3章 - 3.12例外ハンドリング

 3.12.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、以下について知ることができます。
    • 例外ハンドリングの実装方法

  • サンプルアプリケーションの内容
     CB3では特別な例外処理を行いたい場合、サービス内でキャッチすることを想定しています。 サービス内で例外処理を行ったあとに、ジョブを異常終了させたい場合、サービス例外(CB3が提供する例外)や実行時例外、または、エラーをスローします。 スローされた例外はCB3が捕捉し、使用しているリソース(アクセッサで使用したDBやファイルなど)の解放を行った後にジョブを異常終了させます。
     CB3が提供する機能がスローする例外については、各機能のJavadocを参照してください。
     
     このサンプルでは以下のファイルについて説明します。  
    • ExceptionHandling.java
       サービスのプログラムです。
    • 起動用バッチファイル - exceptionhandling.bat
       サービスを起動するためのバッチファイルです。

 3.12.2サービスの作成

  • ExceptionHandling.java

     01:public class ExceptionHandling extends CB3Service {
     02:
     03:    /**
     04:     * 例外キャッチのサンプルメソッド
     05:     * DBアクセスで意図的に例外を発生させている
     06:     */
     07:    @Override
     08:    protected int doService(ServiceParameters serviceparameters,
     09:            RuntimeParameters runtimeparameters) throws ServiceException {
     10:
     11:        LogMessageFactory message = new LogMessageFactory(ExceptionMessageContant.CB3_EXCEPTION_FILE);
     12:
     13:        DBQueryParameterMap param = new DBQueryParameterMap();
     14:        DBAccessor ac = (DBAccessor)getDataAccessContext().lookup("dbaccessConfig");
     15:
     16:        try {
     17:            ac.delete("delete");
     18:
     19:            param.put("ID", "1");
     20:            param.put("VALUE", "test");
     21:            ac.insert("insert", param);
     22:
     23:            //IDが重複するためエラー発生
     24:            param.put("ID", "1");
     25:            param.put("VALUE", "error");
     26:            ac.insert("insert", param);
     27:
     28:        } catch (DataAccessException e) {
     29:            String exceptionMsg = message.getMessage(ExceptionMessageContant.CB3_EXCEPTION_MESSAGE);
     30:            System.out.println(exceptionMsg);
     31:
     32:            //キャッチした例外をラップし送出
     33:            throw new ServiceException(exceptionMsg, e);
     34:        }
     35:
     36:        return ExitCodeConstant.SUCCESS;
     37:    }
     38:}
    


    11行目:
    例外用のメッセージファクトリオブジェクトを生成しています。

    28行目〜34行目:
    このサンプルプログラムではDBアクセスで意図的に発生させた例外をスローしています。doService()メソッドはjp.co.cybec.cb3.exception.ServiceExceptionのみを スローすることができます。よって、33行目ではServiceExceptionに発生元の例外を設定しています。
    ServiceExceptionには以下のメソッドが定義されています。
    public ServiceException(Exception cause) 
    発生元の例外を引数にとります。
    public ServiceException(String msg) 
    例外発生時のメッセージを引数にとります。
    public ServiceException(String msg, Exception cause) 
    発生元の例外と例外発生時のメッセージを引数にとります。

 3.12.3サービスの実行

  • exceptionhandling.bat
    下記バッチファイルはサービスを起動するためのバッチファイルです。

     01:@echo off
     02:
     03:setlocal
     04:
     05:call ./set_classpath_com.bat
     06:
     07:set CLASSPATH=%CB3_HOME%/resources/config/exceptionhandling;%CLASSPATH%
     08:
     09:java jp.co.cybec.cb3.container.provider.ServiceProviderImpl -ServiceName exceptionhandling
     10:
     11:pause
    

    上記バッチファイルを実行すると下記のように表示されます。

    JobProcessID:[exceptionhandling20080822111606] ServiceID:[exceptionhandling] Mes
    sageID:[CB3.EXCEPTION.MESSAGE] サンプル用の例外が発生しました!
    続行するには何かキーを押してください . . .
    

    cb3.log確認すると以下のようにログ出力されています。(一部抜粋)