例外の処理方法

コラボレーションが処理できる例外には 2 つのカテゴリーがあります。

例外が発生すると、アクティビティー・ダイアグラム階層の所定レベルでの例外処理で、次のいずれかの方法で例外を処理できます。

例外をキャッチしない

アクティビティー・ダイアグラムで、例外分岐を使用して例外を明示的にキャッチしない 場合、コラボレーションの実行は (例外が発生したときになった) 例外状態のままです。例外が発生しても、コラボレーション・ランタイム環境はダイアグラム内の実行を停止しません。その代わりにアクティビティー・ダイアグラムのロジックに従って実行を継続し、終了成功ノードまたは終了障害ノードで終了します。

例外のキャッチ

コラボレーション・テンプレートはアクティビティー・ダイアグラム内に、その分岐タイプが Exception に設定されている決定ノード内の分岐である、例外分岐 を使用した例外処理を組み込むことができます。決定ノードにより、アクション・シンボルがその可能性ある決定結果に接続されます。例外分岐により、例外が発生するアクション・シンボルが例外を処理するアクション・シンボルに経路付けされます。例外分岐には、例外分岐がキャッチする例外タイプを指定する例外条件が含まれます。表 44 に、例外条件を定義する際に選択できる、コラボレーション例外タイプをリストします。

注:
アクティビティー・ダイアグラムへの例外分岐の追加方法の詳細については、例外分岐の定義を参照してください。

例外が発生すると、コラボレーション・ランタイム環境により、currentException システム変数が設定されます。例外分岐に従うかどうかを判別するために、コラボレーション・ランタイム環境で例外分岐の条件での例外タイプと currentException システム変数内の例外タイプを比較して、例外分岐の例外条件を評価します。

注:
コラボレーション・ランタイム環境では、コラボレーションの実行が例外状態の場合のみ、例外分岐を検査します。

指定された決定ノードは、最大 7 つの分岐を持つことができます。したがって、多くの例外タイプの例外処理を設定できます。各例外分岐にその例外条件での異なる例外タイプを指定して、その例外タイプについての例外処理ノードを指すことができます。あるいは、例外条件に AnyException 例外タイプを持つ単一の例外分岐で、すべて の例外タイプを処理できます。

コラボレーション・テンプレートで例外をキャッチして例外処理ノードに制御が渡されると、コラボレーション・テンプレートで、次の方法で例外を処理できます。

シナリオ・ロジックの続行

シナリオのロジックを続行するには、例外処理ノードで次のステップを実行します。

  1. 例外を生成しない 方法で例外を処理します。

    例外分岐が指すノード内に、例外を処理するコードを組み込むことができます。表 45 に、一部の使用できる処理ステップをリストします。

  2. アクティビティー・ノード内の実行経路を終了成功ノードまたは終了障害ノードで終了します。

    例外処理ノードが例外を生成しない 限り (raiseException() メソッドを使用して)、コラボレーションの実行は通常状態のままです。したがって、コラボレーション実行の完了時に、コラボレーション・ランタイム環境で未解決のフローは作成されません。コラボレーション・ランタイム環境によるこれらの終了ノードの処理方法の詳細については、通常状態の処理を参照してください。

表 45 に、例外処理ノードで実行できる使用可能な処理ステップの一部をリストします。これらのステップでは、コラボレーションの実行状態は変更しません。したがって、コラボレーションの実行は通常状態のままです。

表 45. 例外処理に使用可能な処理ステップ
例外処理ステップ メソッド 詳細
メッセージをコラボレーションのログ宛先に記録 logError()logWarning()logInfo() メッセージのロギング
例外についての情報の取得 CollaborationException クラスのメソッド 表 43

例えば、logError() メソッドはエラーをコラボレーションのログ宛先に記録します。

この宛先には、標準出力 (STDOUT) またはログ・ファイル (そのように構成されている場合) が可能です。また、このメソッドはエラー・メッセージを E メール受信側に送信します。コラボレーション・テンプレートはこのメソッドを使用してエラーを記録し、管理者がこれを調査できます。次のコード・フラグメントは、CollaborationException クラスの getMessage()getMsgNumber() メソッドを使用して、currentException 変数から例外情報を抽出します。その後この情報を logError() 呼び出しを使用してエラーをフォーマット設定し、コラボレーションのログ宛先に送信します。

// extract exception information
 sMessage = currentException.getMessage();
 imsgNumber = currentException.getMsgNumber();
  
 // log message and send email (if configured)
 logError(imsgNumber, sMessage, ...);
 

詳細については、logError()、logInfo()、logWarning()logError() メソッドの説明を参照してください。エラーをログ宛先に送信するだけでは、明確な例外メッセージを未解決のフローと関連付けるには通常は不十分であることに注意してください。例えば、例外が発生して、例外分岐でキャッチし、例外処理ノードは単にエラーをログに記録して失敗で終了すると仮定します。この場合、不成功のコラボレーションの未解決のフローには失敗したイベントが含まれますが、その例外メッセージはコラボレーション・ランタイム環境のデフォルトのメッセージ (Scenario failed.) のみです。

例外の発生

raiseException() メソッドは、次に高い実行レベルにコラボレーション例外を発生します。

コラボレーション・ランタイム環境で raiseException() 呼び出しが実行されると、コラボレーションの実行が例外状態に変更され、アクティビティー・ダイアグラムのロジックが続行されます。アクティビティー・ダイアグラム内の次に高いレベルに例外を発生するには、例外処理ノードで次のステップを実行します。

  1. 現行の例外から例外情報を取得して、生成された例外に組み込みます。

    例外処理ノード内で、CollaborationException クラスのメソッドを使用して、currentException システム変数から例外情報を抽出できます。

    注:
    currentException 変数からメッセージを抽出して生成された例外に組み込むことができるようにする必要があります。これにより、例外メッセージを未解決のフローと関連付けするときに、このメッセージをコラボレーション・ランタイム環境で使用できます。
  2. raiseException() メソッドの呼び出しを組み込んで、発生する例外を生成します。

    コラボレーション・ランタイム環境で raiseException() 呼び出しが実行されると、コラボレーションの実行を例外状態に変更します。raiseException() 呼び出しにより、次に高い実行レベルに発生する例外が指定されます。

  3. 例外処理コードを含む分岐の実行経路を、終了成功ノードかまたは終了障害ノードで終了します。

    例外を発生したので、コラボレーション実行は例外状態です。各実行レベルで例外が発生される限り (raiseException() を使用)、コラボレーションの実行は例外状態のままです。したがって、コラボレーション実行の完了時に、コラボレーション・ランタイム環境で未解決のフローが作成されます。コラボレーション・ランタイム環境によるこれらの終了ノードの処理方法の詳細については、例外状態の処理を参照してください。

コラボレーション・テンプレートで raiseException() メソッドと logError() メソッドを使用して例外を処理する方法を理解するには、次の例を考慮します。コラボレーションのメインダイアグラムが subdiagramA を呼び出し、それが次に subdiagramB を呼び出すと仮定します。subdiagramB は、例外を発生させる可能性があるサービスを呼び出します。したがって、このサブダイアグラムにはサービス呼び出しを起動するアクション・ノードが含まれます。このアクション・ノードはサービス呼び出し例外を検査する例外分岐を持つ決定ノードに接続します。サービス呼び出し例外が発生すると、例外処理コードを持つアクション・ノードに例外分岐が接続します。

例外が発生すると、コラボレーション・ランタイム環境によりコラボレーションの実行が例外状態に変更され、subdiagramB でのサービス呼び出しと関連した例外分岐の例外条件が評価されます。例外分岐の条件が true と評価されると、例外分岐により例外がキャッチされ、例外分岐が指す例外処理ノードに制御が渡されます。例外分岐が例外をキャッチすると、コラボレーションの実行は通常状態に戻ります。

図 56 に、subdiagramB でのサービス呼び出し例外についての例外処理を実行するコード・フラグメントを示します。

図 56. subdiagramB でのサービス呼び出し例外の処理

// exception handling in subdiagramB
 sMessage = currentException.getMessage();
 sType = currentException.getType();
  
 // raise the exception to subdiagramA
 raiseException(sType, 2345, parameter1, parameter2, sMessage);
 }
 

この例外処理ノードのコードは、次のステップを実行します。

  1. currentException システム変数から例外の情報を調べます。

    コードで currentException から例外メッセージと例外タイプを取得し、2 つのストリング変数 (それぞれ sMessagesType) に保管します。

  2. 親ダイアグラム (この場合は subdiagramA) に例外を発生します。

    例外情報を収集したら、コードで raiseException() メソッドを呼び出して、subdiagramA に例外を発生します。この形式の raiseException() メソッドが、3 つのメッセージ・パラメーターを持つ例外タイプとエラー・メッセージ (2345) として、例外情報を受け取ります。これらのメッセージ・パラメーターには、currentException システム変数からコードで取得した例外メッセージが組み込まれています。その後 raiseException() 呼び出しにより、この例外情報を含む例外が作成されます。また、コラボレーションの実行を例外状態に変更します。

    注:

    1. raiseException() でメッセージに指定されるメッセージ・パラメーターの数は、コラボレーション・メッセージ・ファイル内の特定のメッセージ・フォーマットにより異なります。

    2. raiseException() メソッドを使用して例外処理コードで例外を発生する場合、例外分岐で例外条件を定義するときの場合と同じ例外タイプを指定できます。例外タイプのリストについては、表 44 を参照してください。

raiseException() を実行後、コラボレーション・ランタイム環境で行うアクションは、実行経路を終了する終了ノードにより異なります。実行経路が終了成功ノードで終了すると、コラボレーション・ランタイム環境で次のステップが実行されます。

注:
実行経路が終了障害ノードで終了すると、コラボレーション・ランタイム環境によりコラボレーション全体が終了します。実行状態が例外であるため、ランタイム環境で、raiseException() 呼び出しを発生する例外の例外情報を使用して、未解決のフローが作成されます。

例外分岐を持つ決定ノードが subdiagramA に存在する場合、コラボレーション・ランタイム環境で各例外分岐の条件が評価されます。この例外条件が true に評価されると、subdiagramA は subdiagramB が発生した例外をキャッチします。コラボレーションの実行が通常状態に変更されて例外処理ノードに制御が渡され、このノードで次の raiseException() 呼び出しを使用して親ダイアグラム (メインダイアグラム) に例外を発生して例外を処理します。

// exception handling in subdiagramA: raise the exception to main diagram
 raiseException(currentException);
 

この形式の raiseException() メソッドは、引き数として受け取る例外オブジェクトを発生するだけです。渡された情報から例外は作成しません。この場合、subdiagramB (図 56) 内の例外処理コードで、該当する例外情報を使用して例外が作成済みなので、raiseException() で例外を作成する必要はありません。subdiagramA がその currentException 変数内に持つ例外は、subdiagramB が発生した例外と同じです。raiseException() が完了すると、subdiagramA のロジックに従ってコラボレーションの実行が続行します。subdiagramA の例外処理分岐が終了成功で終了すると、コラボレーション・ランタイム環境は subdiagramA を終了して、その親ダイアグラム (メインダイアグラム) に制御を渡します。したがって、raiseException() で生成される例外オブジェクト (subdiagramA の currentException 例外オブジェクト) は、メインダイアグラムに対して生成されます。

注:
subdiagramA のこの例外処理分岐が終了障害で終了すると、コラボレーションが終了し、例外メッセージを未解決のフローの一部として含むコラボレーション・ランタイム環境に対して、例外オブジェクトが生成されます。

コラボレーションは、現在、メインダイアグラムの subdiagramA ノードで実行されています。subdiagramA の例外処理ノードで raiseException() を呼び出したので、コラボレーション実行は現在、例外状態です。したがって、コラボレーション・ランタイム環境で、発生した例外をキャッチする例外分岐がないかメインダイアグラムを検査します。これらの例外分岐は、subdiagramA の呼び出しを 1 つ以上の例外処理アクション・ノードに接続する決定ノード内にあります。例外分岐の条件が true と評価されると、メインダイアグラムにより subdiagramA が発生した例外がキャッチされます。コラボレーションの実行は通常状態に変化して、例外処理ノードに制御が渡され、このノードで該当する上位レベルの例外処理ステップを実行できます。

例として、メインダイアグラム内のこの例外処理ノードで次のステップを実行すると仮定します。

  1. コラボレーションの SEND_EMAIL 構成プロパティーが、all またはコンマ区切りのメッセージ番号のリストに設定されているかどうかを検証します。

    すべてのコラボレーション・オブジェクトで、logError() がログ宛先に送信するエラーの E メールの受信側を指定できます。コラボレーションが CollaborationFoundation に基づいている場合、SEND_EMAIL コラボレーション・プロパティーに用意されている追加機能を利用できます。コラボレーション・オブジェクトが E メール送信に構成され、さらに SEND_EMAILall またはメッセージ番号のリストに設定されている場合、何らかのエラー (SEND_EMAILall の場合) または指定されたエラー (SEND_EMAIL でメッセージ番号リストが指定された場合) が発生すると、コラボレーションにより指定された受信側に E メールが送信されます。

    これらの条件が一致すると、例外処理ノードにより logError() が呼び出されてエラーがログに記録され、E メールが指定された受信側に送信されます。したがって、コードでまず例外情報を取得して、現行の例外からエラー・メッセージに組み込む必要があります。

    注:
    SEND_EMAIL 構成プロパティーは、CollaborationFoundation の機能です。コラボレーションが CollaborationFoundation に基づいている場合、この SEND_EMAIL プロパティーの検査を実行できます。それ以外の場合、この構成プロパティーは定義されません。
  2. 例外メッセージをコラボレーションのログ宛先に送信し、必要であれば、E メール・メッセージとして送信します。

    コラボレーション・オブジェクトが E メール送信に構成されている場合、logError() メソッドでエラー・メッセージが指定された E メール受信側に自動的に送信されます。この分岐では logError() メソッドを使用して、コラボレーションのログ宛先 (標準出力またはログ・ファイル) に例外を送信します。

次のメインダイアグラムの例外処理ノードのコード・フラグメントは、これらのステップを実行します。

// exception handling in main diagram
  
 // determine if SEND_EMAIL is set to "all" or a message-number list;
 // if so, obtain exception information from the current exception
 sMessage = currentException.getMessage();
 imsgNumber = currentException.getMsgNumber();
  
 // log message and send email
 logError(imsgNumber, sMessage, ...);
  
 // raise the exception to collaboration runtime environment
 raiseException(currentException);
 

コラボレーション・ランタイム環境でこの raiseException() 呼び出しを実行すると、次のステップが実行されます。

管理者が未解決のフローを表示すると、Flow Manager ツールはこの未解決フローのメッセージ (subdiagramB で、最初にスローされたときに例外から取得) を表示します。

Copyright IBM Corp. 2004