はじめに
今回はTryとCatch Errorsについて解説します。何かエラーが予測されている場合に使います。横文字を使うと、ロバストなワークフローを作るにはどうすればいいか。というトピックになります。
すさんのBlogが非常にわかりやすいので、分からない場合こちらを参照していただければと思います。
今回のテーマ ~Try&Catch Errors~
TryのNodeは2種類、CatchのNodeは4種類あります。どれもTryとCatchの機能には変わりないため、挿入したい部分のポート(矢印)から考えてハマりそうなNodeを選択すればOKです!
Workflowは下記からダウンロードできます。
エラーでも止めない努力 - Try Catch Errors – KNIME Hub
覚えてほしいこと
エラーの発生する可能性が予想できる
+
エラーとして止めたくない
というときはTry&Catch
やりたいこと
すさんのブログでは、Loopを使ってExcelにパスワードがかかっているために開けないというエラーが想定されていました。他にも、Webにリクエストを送るときにタイムアウトを想定するなど、エラーが想定される場面で使います。Loopの中に配置することが多いかもしれません。
今回は以前扱ったBreakpointを使用して意図的にエラーを発生させたいと思います。Loopの中にあるBreakpointでエラーが起こってもLoopを続けさせるということを行います。
また、これによりConsoleにログ(メッセージ)を残しながらも、止めずにワークフローを動かすことが可能になります。
Try / Catch Errorsの使い方
「エラーの発生する可能性が予想できる+エラーとして止めたくない」というときにTry&Catchをセットで使用します。
TryとCatch Errorsにはいくつかの種類がありますが、全てポートの違いなのでエラーを予想するNode・ワークフローの種類によって選んでいけばいいです。
Nodeの特徴として、Tryはポートが一つなのに対して、Catch ErrorsはInput2つ、Output2つです。これはCatch Errorsには通常のフローとは別に、Tryの後でエラーが発生した場合に代わりにデータを受け取るポートが必要だからです。
Workflow
エラーが発生した時と通常の時の2種類お見せします。今回は分かりやすくするために、String Manipulationで結果を示すコラムを追加しています。
また、注意点として、Loop Endでは同じコラムリストのあるデータ出ないとエラーが発生してしまうので、エラーが発生しても通常の場合と同じコラムの名前・数で渡す必要があります。
今回は、同じString Manipulationで同じコラムを追加していますが、データもそのまま入ってしまうのがいや場合もあると思います。そんな時は、空テーブル(コラムだけでデータがないテーブル)をTable Creator等で作成すればデータが入らず、Loop Endでもエラーが発生しません。
Workflow - エラーがない場合
エラーが発生しない場合は、通常のフローとして処理され、Catch Errors の上のInputポートから流れてくるデータをそのまま後工程に流します。
Catchの下のポートも実行はされますが、Catch Errorsの部分で無視されます。
Tryはエラーの発生が予想されるNodeのフローの前に置いておきます。
Workflow - エラーが発生した場合
Catch Errorsの上のInputポートに繋がるワークフローでエラーが起こると、Catch Errorsの下のInputポートからテーブルを受け取ることになります。
また、Flow variableのOutputにエラー内容が渡されます。
Confirm - Catch Errors
TryのOutputはその直前のNodeのOutputと変わりないので省略します。Catch Errorsについては、エラーが発生するかによってOutputが変化するので先ほどと同様にエラーが発生するかどうかの2通りでお見せします。
Workflow - エラーがない場合
エラーがない場合は、下のInputに入るフローは実行されるものの、下のOutputは無視されます。なので通常のフローからのInput(上のInputポート)がOutputとして採用されます。
また、variableのOutputはこのようになっています。通常のLoop内のvariableと変わりないですね。
Workflow - エラーが発生した場合
続いてエラーが発生した場合を見ていきましょう。Workflowでも見えた通り、上のInputはエラーが発生しているためにテーブルがありません。そのため、下からのInputポートのテーブルをOutputのテーブルとして採用します。
また、Flow variablesのOutputに3つの変数が追加されています。それぞれ、下のような感じです。(この変数はCatch ErrorsのConfigureでエラーが発生しない場合も作ることが可能です。)
- FailingNodeStackTrace:Node開発者なら分かる、Nodeの裏側で動いているJavaのエラー文
- FailingNodeMessage:エラーが出たNodeが出したエラーメッセージ。Console画面に出てくる文と全く同じ。「Breakpoint halted execution (currentIteration=2)」
- FailingNode:エラーが出たNodeの名前 「Breakpoint」
また、エラーは発生しているので、Try&Catchでワークフローは引き続き実行されていたとしても、Console画面にエラーメッセージが記録されています。
お気づきの方いらっしゃるでしょうか。通常のエラーメッセージに1文追加されています。「Execution failed in Try-Catch block: Breakpoint halted execution (currentIteration=2)」
Configure
TryとCatchについては、配置の仕方だけが注意すべきポイントで、特段このNodeに設定する要素はありません。一応見ておきましょう。
Configure - Try
まずはTryからです。特に設定はありません。
Configure - Catch Errors
次にCatch Errorsを見ていきましょう。ほとんど設定はないのですが、1点だけオプションがあります。
この「Always populate error variable」にチェックを入れると、エラーが発生しなくてもエラー時に出てきた変数が作成されることになります。エラーが発生していない場合のこれら変数のデフォルト値も決めることができます。デフォルトではNoneになっていますね。
チェックをつけてみると、エラーが発生していないときのFlow variableのOutputはこんな感じになります。
おわりに
ちょっと分かりにくかったですかね、、Try&Catchは出番こそ少ないですが、使い方次第で止まりにくいワークフローを作れるので特に自動実行を設定していたり、実行時間の長いワークフローに入れてあげると便利です。
これで一通りKNIMEの基本機能について説明できたかなーと思います。Componentとか一応ありますけど、そこまで需要ない気がするので、、
これからは今まで説明していなかったNodeを説明したり、KNIMEのSelf Learningコースを解説したりしようと思っていますが、もしこんなの解説して欲しい等あればぜひコメント等お待ちしています。
ではまた。
余談
今回も楽天モバイルについてです。日曜日、一人で山登ったんですが、山の中・山頂で電波は入りませんでした。。。。
一応楽天モバイルのエリアを検索したところパートナー回線であれば入るという表示だったんですが、、
ここはやっぱり格安SIMの少し弱いところですかね。まあ山頂で電波なくて困ることといえば、インスタにStoryを上げられないくらいですから別に支障はないんですけどねー。今度キャンプ場とかスキー場に行って試してみたいです。
参考リンク
- すさんのBlog:
【KNIME】ノード紹介:Try, Catch Errors 〜折角流した処理がエラーで止まるのを回避する〜 - 非プログラマーのためのインフォマティクス入門。(仮)
- KNIME公式Node Pit(英語):
Catch Errors (Var Ports) — NodePit
- KNIME e-Learning (英語):
- KNIME Example Workflow(英語):
Catch Errors (Data Ports) – KNIME Hub