ExceptionHandler(例外ハンドラ)
ExceptionHandler(例外ハンドラ)
これは、保護ノード実行中に発生した例外をキャッチして処理するハンドラ本体を指定する要素である。
属性
なし
関連
- protectedNode
- ExecutableNode[1..1] 例外ハンドラによって守られている保護ノード。
- handlerBody
- ExecutableNode[1..1] 捕らえることができない例外が発生したときに、ハンドラが実行されるノード。
- exceptionType
- Classifier[1..*] ハンドラが捕まえることができるインスタンスの種別。適合する型の例外が発生した場合、ハンドラはその例外を捕まえて、ハンドラ本体を実行する。
- exceptionInput
- ObjectNode[1..1] ハンドラ本体内のオブジェクトノード。例外を捕まえたとき、例外トークンは,このノードに置かれ、本体の実行を起動する。
制約
- 例外処理とその入力オブジェクトノードは,いかなるエッジの起点にも終点にも指定することはできない。
- 例外処理構造化ノード内に起点を持つエッジは、その例外処理の中に終点を持たなければならない。
- 例外ハンドラ本体の結果ピンは、被保護ノードの結果ピンと、多重度、型が一致していなければならない。
- ハンドラ本体は、入力を1つ持ち、その入力は例外の入力と同じである。
セマンティクス
- きっかけ
- RaiseExceptionActionの実行が引き金である。
- 他はすべて止まる
- ハンドラ本体の実行時、他のすべてのトークンは停止する。
- 型の一致
- ハンドラは、例外型が同じであるか、もしくは、そのサブセットであれば、合致する。
- 合致したら何が起こるか
- 型が合致した場合、ハンドラはその例外をキャッチする。
- 例外オブジェクトが置かれるところ
- 例外オブジェクトは、ハンドラ本体を開始するトークンとして、exceptionInputに置かれる。
- キャッチされない場合
- ハンドラが、その例外を捕らえることができない場合(型の不一致)例外はより上位のコンテクストに向かってスローされるが、もし、その例外が発生したアクティビティ、および、それを含むアクティビティが非同期に実行されていた場合、例外はスローされるべきコンテクストを識別することができないため、消失することになる。
- アクティビティが同期的に実行されていたら
- 例外は、どこかで捕らえられるまで、上位に向かってスローされて伝播し続ける。
- 誰も捕まえなかったら
- システムの最上位までスローされても、キャッチすることのできるハンドラが存在しない場合、システムの動作は未定義である(運がよければ落ちる)このようなケースにシステムがどのように対処するべきかを、プロファイルで規定することもできる。
- ハンドラは持たない
- 例外ハンドラ本体は、入力エッジも出力エッジも持たない。
- ハンドラ本体の結果
- ハンドラ本体の結果トークンは、保護ノードの結果トークンになる。
- 保護ノードの制御エッジ
- ハンドラ本体の結果は、保護ノードから出ていく制御エッジに渡されることになる。
- ハンドラの実行完了は何に見えるか
- ハンドラ本体の実行完了は、あたかも保護ノードの完了のようにみえる。
記法
- 保護ノードから、ハンドラ本体に向かう、稲妻型の矢印(実線)で表す。
- 小さな稲妻エッジを、普通の直線矢印の近くに書いてもいい。
- ハンドラ本体を示す角の丸い長方形には、小さな四角をつけて書く。この四角は、ハンドラ本体に所有された例外入力ノードである。