デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - エラーでも止めない努力 - 例外処理 ~Try / Catch Errors~

f:id:makkynm:20201224203135p:plain

 

はじめに

 今回はTryとCatch Errorsについて解説します。何かエラーが予測されている場合に使います。横文字を使うと、ロバストなワークフローを作るにはどうすればいいか。というトピックになります。

すさんのBlogが非常にわかりやすいので、分からない場合こちらを参照していただければと思います。

sumtat.hatenablog.com

 

 今回のテーマ ~Try&Catch Errors~

 TryのNodeは2種類、CatchのNodeは4種類あります。どれもTryとCatchの機能には変わりないため、挿入したい部分のポート(矢印)から考えてハマりそうなNodeを選択すればOKです!

f:id:makkynm:20201224203000p:plain

今回のテーマ - Try & Catch Errors

 

覚えてほしいこと

エラーの発生する可能性が予想できる

エラーとして止めたくない

というときはTry&Catch

 

やりたいこと

すさんのブログでは、Loopを使ってExcelにパスワードがかかっているために開けないというエラーが想定されていました。他にも、Webにリクエストを送るときにタイムアウトを想定するなど、エラーが想定される場面で使います。Loopの中に配置することが多いかもしれません。

今回は以前扱ったBreakpointを使用して意図的にエラーを発生させたいと思います。Loopの中にあるBreakpointでエラーが起こってもLoopを続けさせるということを行います。

また、これによりConsoleにログ(メッセージ)を残しながらも、止めずにワークフローを動かすことが可能になります。

f:id:makkynm:20210117202134p:plain

やりたいこと - Try and Catch Errors

 

Try / Catch Errorsの使い方

「エラーの発生する可能性が予想できる+エラーとして止めたくない」というときにTry&Catchをセットで使用します。

TryとCatch Errorsにはいくつかの種類がありますが、全てポートの違いなのでエラーを予想するNode・ワークフローの種類によって選んでいけばいいです。

Nodeの特徴として、Tryはポートが一つなのに対して、Catch ErrorsはInput2つ、Output2つです。これはCatch Errorsには通常のフローとは別にTryの後でエラーが発生した場合に代わりにデータを受け取るポートが必要だからです。

Workflow

エラーが発生した時と通常の時の2種類お見せします。今回は分かりやすくするために、String Manipulationで結果を示すコラムを追加しています。

f:id:makkynm:20210117211107p:plain

Configuration - String Manipulation(上のInputポートに繋がる)

f:id:makkynm:20210117211204p:plain

Configuration - String Manipulation(下のInputポートに繋がる)

 

また、注意点として、Loop Endでは同じコラムリストのあるデータ出ないとエラーが発生してしまうので、エラーが発生しても通常の場合と同じコラムの名前・数で渡す必要があります。

今回は、同じString Manipulationで同じコラムを追加していますが、データもそのまま入ってしまうのがいや場合もあると思います。そんな時は、空テーブル(コラムだけでデータがないテーブル)をTable Creator等で作成すればデータが入らず、Loop Endでもエラーが発生しません。

 

Workflow - エラーがない場合

エラーが発生しない場合は、通常のフローとして処理され、Catch Errors の上のInputポートから流れてくるデータをそのまま後工程に流します。

Catchの下のポートも実行はされますが、Catch Errorsの部分で無視されます。

f:id:makkynm:20210117200728p:plain

Workflow - エラーがない場合

Tryはエラーの発生が予想されるNodeのフローの前に置いておきます。

 

Workflow - エラーが発生した場合

Catch Errorsの上のInputポートに繋がるワークフローでエラーが起こると、Catch Errorsの下のInputポートからテーブルを受け取ることになります。

また、Flow variableのOutputにエラー内容が渡されます。

f:id:makkynm:20210117200750p:plain

Workflow - エラーが発生した場合

 

Confirm - Catch Errors

TryのOutputはその直前のNodeのOutputと変わりないので省略します。Catch Errorsについては、エラーが発生するかによってOutputが変化するので先ほどと同様にエラーが発生するかどうかの2通りでお見せします。

Workflow - エラーがない場合

エラーがない場合は、下のInputに入るフローは実行されるものの、下のOutputは無視されます。なので通常のフローからのInput(上のInputポート)がOutputとして採用されます。

f:id:makkynm:20210117212342p:plain

Confirm - Catch Errors (上)

また、variableのOutputはこのようになっています。通常のLoop内のvariableと変わりないですね。

f:id:makkynm:20210117212557p:plain

Confirm - Catch Errors (下)

 

Workflow - エラーが発生した場合

続いてエラーが発生した場合を見ていきましょう。Workflowでも見えた通り、上のInputはエラーが発生しているためにテーブルがありません。そのため、下からのInputポートのテーブルをOutputのテーブルとして採用します。

f:id:makkynm:20210117213107p:plain

Confirm - Catch Errors (上)

また、Flow variablesのOutputに3つの変数が追加されています。それぞれ、下のような感じです。(この変数はCatch ErrorsのConfigureでエラーが発生しない場合も作ることが可能です。)

  • FailingNodeStackTrace:Node開発者なら分かる、Nodeの裏側で動いているJavaのエラー文
  • FailingNodeMessage:エラーが出たNodeが出したエラーメッセージ。Console画面に出てくる文と全く同じ。「Breakpoint halted execution (currentIteration=2)」
  • FailingNode:エラーが出たNodeの名前 「Breakpoint」

f:id:makkynm:20210117213315p:plain

Confirm - Catch Errors (下)

また、エラーは発生しているので、Try&Catchでワークフローは引き続き実行されていたとしても、Console画面にエラーメッセージが記録されています。

お気づきの方いらっしゃるでしょうか。通常のエラーメッセージに1文追加されています。「Execution failed in Try-Catch block: Breakpoint halted execution (currentIteration=2)」

f:id:makkynm:20210117214208p:plain

Confirm - Console エラーメッセージ

 

Configure

TryとCatchについては、配置の仕方だけが注意すべきポイントで、特段このNodeに設定する要素はありません。一応見ておきましょう。

Configure - Try 

まずはTryからです。特に設定はありません。

f:id:makkynm:20210117214838p:plain

Configure - Try

 

Configure - Catch Errors

次にCatch Errorsを見ていきましょう。ほとんど設定はないのですが、1点だけオプションがあります。

f:id:makkynm:20210117215100p:plain

Configure - Catch Errors

この「Always populate error variable」にチェックを入れると、エラーが発生しなくてもエラー時に出てきた変数が作成されることになります。エラーが発生していない場合のこれら変数のデフォルト値も決めることができます。デフォルトではNoneになっていますね。

チェックをつけてみると、エラーが発生していないときのFlow variableのOutputはこんな感じになります。

f:id:makkynm:20210117215502p:plain

エラーが発生していないときのFlow variable - オプションON

 

おわりに

ちょっと分かりにくかったですかね、、Try&Catchは出番こそ少ないですが、使い方次第で止まりにくいワークフローを作れるので特に自動実行を設定していたり、実行時間の長いワークフローに入れてあげると便利です。

これで一通りKNIMEの基本機能について説明できたかなーと思います。Componentとか一応ありますけど、そこまで需要ない気がするので、、

これからは今まで説明していなかったNodeを説明したり、KNIMEのSelf Learningコースを解説したりしようと思っていますが、もしこんなの解説して欲しい等あればぜひコメント等お待ちしています。

 ではまた。

 

 

余談 

 今回も楽天モバイルについてです。日曜日、一人で山登ったんですが、山の中・山頂で電波は入りませんでした。。。。

一応楽天モバイルのエリアを検索したところパートナー回線であれば入るという表示だったんですが、、

ここはやっぱり格安SIMの少し弱いところですかね。まあ山頂で電波なくて困ることといえば、インスタにStoryを上げられないくらいですから別に支障はないんですけどねー。今度キャンプ場とかスキー場に行って試してみたいです。

 

 

参考リンク