Talend入門 (10)　～エラーハンドリング～

##全体の目的
Talendの超簡単なサンプルジョブを作成して，ETLジョブ開発に必要なスキルを習得することが目的です。

##対象者
ETL / EAI技術者

##環境
|使用環境|バージョン|
|:----:|:------------------|
|OS|Windows10|
|Talend|7.1.1|	

##サンプル一覧
以下の順番で習得していきます

|#|内容|
|:----:|:------------------|
|1|[はじめてのTalend](https://qiita.com/airkoda/items/a837d3c5d851d98d2612)|
|2|[ファイルI/O](https://qiita.com/airkoda/items/1cd12c05c6136add7178)|
|3|[データベースI/O](https://qiita.com/airkoda/items/bc807c920c3adebad837)|
|4|[tMap](https://qiita.com/airkoda/items/fa4a9c022b5d688698e0)|
|5|[イテレータ](https://qiita.com/airkoda/items/404d2d65eff535b2126c)|
|6|[メタデータ](https://qiita.com/airkoda/items/4b42cf2a86f34abb6c87)|
|7|[Context変数](https://qiita.com/airkoda/items/42d294fca40b81aa20fb)|
|8|[Global Map](https://qiita.com/airkoda/items/1aba0d36905c755deeae)|
|9|[tHashInput/tHashOutput](https://qiita.com/airkoda/items/d9347865190f0f3ab180)|
|**10**|[**エラーハンドリング（今回）**](https://qiita.com/airkoda/items/85e7c49a9bf6a21db6d5)|
|11|[ロギング](https://qiita.com/y-fujioka-yoshiharu/items/e0280f34cff2e3d00bda)|
|12|[子ジョブ（ジョブのネスト）](https://qiita.com/y-fujioka-yoshiharu/items/04ea4bd74ded382cf03c)|
|13-1|[設定ファイル読み込みオリジナル版](https://qiita.com/airaotaku/items/92f114795108f25e6d0f)|
|13-2|[設定ファイル読み込みコンポ版](https://qiita.com/airyama/items/83c2bf9b2d51a79c3714)|
|14|[tJava](https://qiita.com/airkoda/items/4d81d76c36b6fcbd4d89)|

[サンプルコード（Talendプロジェクトデータ）](https://github.com/kd2air/qiita)

##今回の目的
エラーハンドリングについて理解する。

##3種類のエラーハンドリング

Talendでは3種類のエラーハンドリングが可能です。

| #  | 種類 | 説明  |
|:-----------------|:------------------|:------------------|
| 1 | Java例外  | JavaのExceptionをキャッチして対処する |
| 2 | [tDie]コンポーネント  | [tDie]による処理続行不可エラーをキャッチします。[tDie]は強制終了させたい場合に利用します。 |
| 3 | [tWarn]コンポーネント  | [tWarn]によるワーニングをキャッチします。[tWarn]は後続処理を続行できます。 |

##サンプルプログラム概要
上記3種類の例外をキャッチするジョブを作り自由にエラーハンドリングができることを確認します。

## [tLogCatcher]を利用したジョブ

それではサンプルジョブを作成していきましょう。
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]に**err_handling**と入力し[Finish]ボタンをクリックします。
![GS000325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b76db50f-59e3-00f6-dd61-1bd45f9444f6.png)


### シンプルなFile出力処理の作成
[tRowGenerator]と[tFileOutputDelimited]を配置します。
![GS000353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/9a18b872-5a22-e9c0-37b7-ca22db2d54a9.png)

[tRowGenerator]コンポーネント上でダブルクリックし設定画面を開きます。
[+]ボタンを一度押下し、ダミーの1カラムだけ定義します。
![GS000354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/d27f35c2-3952-bd1d-de70-d5cc5464d627.png)

[tFileOutputDelimited]の出力先ファイル名を設定します。
このサンプルでは "C:/work/err_handling/out.csv" としました。
![GS000355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/da25fb0c-64c0-3eb9-c761-3c983061ced9.png)

ロウをつなぎます。
![GS000356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/cba957e9-f5e3-d311-82c4-0cc408a71b05.png)

ここまでで一度実行してみましょう。正常に処理されます。
![GS000357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/26bf41a0-3a44-49fe-ed09-7fdd6d6dcb1a.png)

そのまま2度目の実行をしましょう。今度はエラーになるはずです。
![GS000358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b34ea6bd-6b80-a21e-4a74-db087374dfcc.png)
`The particular file "C:\work\err_handling\out.csv" already exist.`
このエラーは[tFileOutputDelimited]の出力モードが新規作成になっている為に出たものです。
この例外をしっかりと対処していきましょう。

### 例外をキャッチする処理の組み込み
[tLogCatcher]と[tMap]と[tLogRow]を配置します。
![GS000359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/584d5905-e4da-a207-2649-bb79037b5191.png)

[tLogCatcher]と[tMap]をロウでつなぎます。
![GS000360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/ab02d27c-da13-ec12-cafb-35f9994eba0e.png)

[tMap]コンポーネント上でダブルクリックし設定画面を開きます。
[+]でout1を作成します。
![GS000361.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/7e019b13-c8f5-6c2b-f9b2-4a7df6971153.png)
![GS000362.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b0cdc104-952a-0b18-f979-b6493170c453.png)

入力のカラムを全てout1へマッピングしOKで編集画面を閉じます。
![GS000363.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/4003b47e-8188-0fbe-c17f-21a62cc0a4c3.png)

[tMap]上で右クリックし、out1を[tLogRow]につなぎます。
![GS000363b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b99a2217-a02e-cdfe-7c42-6fe79fb29f3f.png)
![GS000364.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2bab9f15-e04e-63f7-6ef7-06c80fe090f8.png)

[tLogRow]の出力表示モードは見やすくする為「縦に出力」を選んでおきましょう。
![GS000365.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/1a8cb5d9-a6d2-1f90-cfc0-d4bbc2f01790.png)

それでは実行してみましょう。
先ほどのJava例外を[tLogCatcher]でキャッチし処理していることが確認できます。
![GS000366.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/bfef66fa-a322-4c6b-6d72-5ac1ec9403e1.png)

### 例外をコントロールする
ここまででJava例外を処理することはできるようにはなりました。
しかし、これでは全Exceptionをキャッチしているだけでコントロールしているとは言えませんので次はエラー処理を意識して実装してみましょう。

エラーを自分自身で制御するために[tDie]を配置します。
![GS000367.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/4ead6689-5407-12d7-f42b-5c74eda93175.png)

[tRowGenerator]で右クリックし、サブジョブがエラーの場合を選び[tDie]につなぎます。
![GS000367b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2afc5486-c7b9-0df9-6511-3e92a833e177.png)
![GS000368.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/09338a1f-d149-bf58-bc9a-125f2bd7c246.png)

停止メッセージとエラーコードは下記のように設定します。

| 設定項目       |  設定値 |
|:-----------------|:------------------|
| 停止メッセージ             |エラーが発生しました|
| 停止コード            |99|
![GS000369.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/e232ee47-5ea0-91d0-5571-65c110a5ebc1.png)

実行してみましょう。
[tDie]で発生させたエラーを[tLogCatcher]でキャッチし処理していることが確認できます。
終了コードは99で終了しています。
![GS000370.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/6ba44774-9ac2-8811-0fbd-fca9096da516.png)

[tDie]の内容を取得できていることが確認できます。
![GS000371.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b7f85784-daf9-7549-bebd-e816e71b7d2e.png)

### ワーニングをコントロールする
[tLogCatcher]はエラーハンドリングとしてもう一つ[tWarn]をキャッチすることができます。
サンプルで見ていきましょう。まず[tWarn]を配置します。
![GS000372.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/51b8b43c-aaaf-74cb-4617-103d473d40ed.png)

下記設定にします。

| 設定項目       |  設定値 |
|:-----------------|:------------------|
| 警告メッセージ             |ファイルの書き出しに成功|
| コード            |42|
| 優先度            |情報|
![GS000373.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2e46e5eb-dff6-64cc-47e9-cd28ddb54d98.png)

[tRowGenerator]で右クリックし、サブジョブがOKの場合を選び[tWarn]につなぎます。
![GS000374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/722a5bd0-4dac-619a-2e36-80b366cdd9ae.png)

正常系を走らせるので[tFileOutputDelimited]でエラーにならないように追加のチェックを入れておきます。
![GS000375.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/86843ae9-be3c-4665-4a1e-9219ff3fe58f.png)

実行します。
[tLogCatcher]が呼び出されました。
![GS000376.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/62b92fc3-59d0-f9ef-e7c5-44ae7c01af2f.png)

※[プライオリティ](https://help.talend.com/reader/41_ybDITKyuD01jGtDFvnw/_4dOmbbVkf6_bKXAvW8vhA)3は優先度で設定した**情報**を表しています。

ここで一つ気になることが、終了コードが0となっています。
実は[tWarn]のコードは後続処理で利用できるだけであって、ジョブの終了コードに設定されるわけではありません。

### 終了コードをコントロールする
例えば準正常の終了コードを0以外の値にするなど、終了コードのコントロールはよく使われます。
最後にTalendでの終了コード設定方法を説明します。

[tJava]を配置します。
![GS000376b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/400fc5a2-0a01-9689-7406-eea5c708468a.png)

[tWarn]からはサブジョブOKでつないだうえで下記コードを設定します。
`errorCode = ((Integer)globalMap.get("tWarn_1_WARN_CODE"));`
つまりは **errorCode** という変数を上書きすることで終了コードを制御できます。
![GS000377.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/4b2f1b08-5a56-e6e6-f00b-4c6d5158d075.png)

実行します。
[tWarn]で定義したコードでジョブを終了していることが確認できます。
![GS000378.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/7b434178-e8eb-ef74-d2e8-54d18a9a3c18.png)

##まとめ
今回はTalendでのエラーハンドリングを確認しました。

※毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

お疲れ様でした。

##次回以降
次回はロギングをやっていきます。