今回はMuleフローを実装する上で絶対覚えておくべき例外処理について、ポイントを説明します。
今回使うコンポーネント
コンポーネント | アイコン | 用途 |
---|---|---|
Raise error | 例外をスローする | |
try | 例外をキャッチする領域を指定する | |
On Error Continue | 該当のExceptionが発生した際に実行されるフロー Try-catchでいうcatchに当たる部分に該当 | |
On Error Propaget | 該当のExceptionが発生した際に実行されるフローだが、継続して例外を上位のフローへスローする | |
Error handler | エラー処理用のフロー |
エラーの起こし方
例外を発生させるには2通りのやり方があります。
Raise errorを使用して例外を発生させる
フロー内にRaise errorコンポーネントを使用して意図的に例外を発生させます。Raise errorを使用した場合は、自身でエラーの内容(Type)を定義することができます。
各コンポーネントから発せられる例外
例外は意図的に起こせるものだけではありません。色々な例外が想定され、接続エラー・変換のエラー・制限値超過エラーなどさまざまなエラーがあります。この場合は、コンポーネント内の処理過程の中でRaise errorを使用しなくても、そのコンポーネントが例外を発生させます。
例えば、Set Variableコンポーネントで以下の計算式を変数に入れようとした場合、
ゼロ徐算となるため、実行時にSet Variableコンポーネントから以下のような例外が発せられます。
"Division by zero
1| 1/0
^^^
Trace:
at anonymous::main (line: 1, column: 1)" evaluating expression: "1/0".
例外の種類については自身では定義できないため、どのコンポーネントでどの例外が発生するかについては各コンポーネントのリファレンスを参照してください。
例外のキャッチ
例外を発生させる所があれば、例外をキャッチしてエラー処理をする場所もあります。どこでキャッチするのかと例外を拾える領域について押さえておきましょう。
Try内で例外をキャッチ
フロー内にTryを設置して、その設置した範囲内で発生した例外に対し、Try内のError handlingでエラー処理をします。Tryの外で発生した例外についてはキャッチされません。
メインフローのError handling内でキャッチする
メインフロー内にError handling領域が設定されており、メインフロー全体にTryが掛かっているイメージで、明示的に指定したTryでキャッチしきれない例外やその外側で発生した例外はこちらでキャッチされます。
メインフロー内のError handlingでエラー処理をする場合は、2通りの書き方があります。
Error handling領域に直接記入
メインフローのError handling領域にOn Error ContinueやOn Error Propagetを直接記入してメインフロー内で発生した例外を処理します。視覚的に分かりやすいです。
Error handlerを使用してエラー処理の場所を紐付け
Error handlerというエラー処理用のフローを作成して、メインフローのError handlingにError handlerと紐付けを行います。メインフローで発生した例外は紐づけられたError handler領域でエラー処理されます。
Error handlerと紐付けた場合は、Error handling領域へのフローの記載はできません。複数のメインフローがあり、共通的なエラー処理を行う場合はこちらの方法がおすすめです。
次回、エラー処理経路を整理します
ざっと例外処理の概要について説明しましたが、Muleの例外処理は少しややこしいところがあるので、実際にどういう時にどういう経路でエラー処理が行われるか、実機検証しながら詳細を整理していきたいと思います。
コメント