このガイドでは、Node-REDのCatchノードについて、初心者の方でも理解できるように詳しく説明します。
Catchノードは、フロー内で発生したエラーをキャッチ(捕捉)するノードです。 日常生活で例えると、サーカスの安全ネットのようなものです。
🎪 サーカスの安全ネットに例えると:
Catchノードは、指定したノード(または全ノード)でエラーが発生したとき、 エラー情報を含むメッセージを出力します。 これにより、エラー発生時の通知、ログ記録、リカバリ処理などを実装できます。
同じタブ(フロー)内のすべてのノードからエラーをキャッチ
指定したノードのみからエラーをキャッチ
他のCatchノードでキャッチされなかったエラーのみをキャッチ
| 設定項目 | 説明 | デフォルト値 |
|---|---|---|
| 名前 | ノードの表示名(任意) | 空白 |
| エラー取得元 | 監視対象の選択方法(全ノード/グループ内/選択したノード) | 全ノード |
| Catchノードで処理済みのエラーを無視 | 他のCatchノードで既に処理されたエラーを無視する | オフ |
Catchノードは、エラー発生時にmsg.errorオブジェクトを追加して出力します。
📥 サンプルフローのインポート方法:
このサンプルフローには、以下で説明する全パターンの実例が含まれています。
参照元:NodeREDエディター内サンプルフロー
用途: 特定のノード(Function等)で発生するエラーを個別に処理
📌 動作の流れ:
throw new Error("Error!") を実行設定例:
📌 応用パターン(サンプルフローには含まれていません):
Catchノードは以下のような高度なエラーハンドリングにも活用できます:
📝 課題:
Functionノードで意図的にエラーを発生させ、Catchノードでキャッチしてください。
🎯 要求仕様:
throw new Error("テストエラー") を実行📊 期待される動作:
✅ 成功の条件:
msg.error.message が "テストエラー" として表示されるmsg.error.source.name が "エラー発生"(Functionノードの名前)になっているerror プロパティが存在するInjectノードの設定:
Functionノードの設定:
throw new Error("テストエラー");Catchノードの設定:
Debugノードの設定:
📝 課題:
エラー情報を整形して、わかりやすいログメッセージを作成してください。
🎯 要求仕様:
📊 期待される動作:
✅ 成功の条件:
"[計算処理] エラー: ゼロ除算エラー" という文字列が表示されるFunctionノードの設定:
throw new Error("ゼロ除算エラー");Catchノードの設定:
Templateノードの設定:
[{{error.source.name}}] エラー: {{error.message}}Debugノードの設定:
📝 課題:
特定ノード用Catchと未捕捉エラー用Catchを組み合わせて使ってください。
🎯 要求仕様:
📊 期待される動作:
✅ 成功の条件:
msg.error.message に、それぞれ「処理Aでエラー」「処理Bでエラー」が表示されるInject Aノードの設定:
Inject Bノードの設定:
Functionノード(処理A)の設定:
throw new Error("処理Aでエラー");Functionノード(処理B)の設定:
throw new Error("処理Bでエラー");Catchノード(専用)の設定:
Catchノード(未捕捉)の設定:
📝 課題:
エラー発生時にログをファイルに記録し、一定回数以上のエラーで警告を出すシステムを作成してください。
🎯 要求仕様:
📊 期待される動作:
✅ 成功の条件:
"⚠️ 警告: エラーが頻発しています!" が追加されたメッセージが表示される"2024/1/15 9:30:00")が含まれているエラー発生用Functionノードの設定:
throw new Error("データ形式エラー");Catchノードの設定:
ログ整形用Functionノードの設定:
new Date().toISOString() を使用Functionノードのコード例:
Catchノードをマスターしたら、以下のノードも学んでみましょう:
| 問題 | 原因 | 解決方法 |
|---|---|---|
| エラーがキャッチされない | Catchノードが別タブにある | エラー発生ノードと同じタブにCatchを配置 |
| 特定ノードのエラーのみキャッチしたい | スコープが「すべてのノード」になっている | 「選択したノード」に変更して対象を指定 |
| Catchが2回発火する | 複数のCatchが同じノードを対象にしている | スコープを見直して重複を解消 |
| msg.errorが空 | エラーがthrow以外の方法で発生 | node.error(msg, "エラー")を使用して明示的にエラー発生 |
| 未捕捉Catchが動作しない | 別のCatchがすでにキャッチしている | 他のCatchのスコープを確認、または削除 |
| エラー発生元がわからない | msg.error.sourceを確認していない | Debugでmsg全体を出力してsource.nameを確認 |
| 方法 | 構文 | 特徴 |
|---|---|---|
| throw | throw new Error("メッセージ"); |
処理を即座に中断、Catchでキャッチ可能 |
| node.error() | node.error("メッセージ", msg); |
エラーを発生させつつ処理を継続可能、第2引数でmsgを渡す |
| node.warn() | node.warn("メッセージ"); |
警告ログのみ、Catchでは捕捉されない |
このガイドが役に立ちましたら、実際のプロジェクトで練習してみてください!
Catchノードは堅牢なフロー構築に欠かせないツールです。
参照元:NodeREDエディター内サンプルフロー