title: エラーハンドラー / Try-Catch translationKey: error-handler-try-catch description: エラーハンドラー(多くの場合Try-Catchブロック)は、自動化やAIチャットボットにおける予期しない障害を管理し、クラッシュを防ぎ、制御された復旧やログ記録を可能にします。 keywords:
- エラーハンドラー
- try-catch
- 例外処理
- 自動化
- AIチャットボット category: General type: glossary date: ‘2025-12-19’ lastmod: ‘2025-12-19’ draft: false e-title: Error Handler / Try-Catch term: えらーはんどらー / とらい きゃっち url: “/ja/glossary/Error-Handler—Try-Catch/”
エラーハンドラー / Try-Catchとは?
自動化およびAIチャットボット開発において、エラーハンドラー(通常はTry-Catchブロックとして実装される)は、実行時例外を捕捉して管理する構造化されたメカニズムであり、ワークフロー全体のクラッシュを防ぎます。無効な入力、ネットワーク障害、またはロジックエラーによって操作が失敗した場合、Try-Catchブロックは制御不能な終了を許すのではなく、専用の回復パスを起動します。
エラーハンドリングがなければ、単一の予期しない障害が自動化プロセスをクラッシュさせたり、チャットボットセッションを未定義の状態に陥らせたりする可能性があります。Try-Catchブロックは例外を予測し、関連するエラー情報を捕捉し、制御された応答を可能にします。それがトラブルシューティングのためのログ記録、ユーザーフレンドリーなメッセージの表示、回復の試行、または人間による監視へのエスカレーションであっても同様です。この回復力により、脆弱な自動化は、現実世界の予測不可能性に対処できる本番環境対応のシステムに変わります。
JavaScriptやPythonからC#、UiPathのようなRPAツールまで、現代の開発プラットフォームは、Try-Catch構造をコア機能として実装しています。構文のバリエーションにもかかわらず、基本的なパターンは一貫しています。保護されたコンテキストでリスクのある操作を試行し、例外が発生したときにそれを捕捉し、結果に関係なくクリーンアップまたは回復ロジックを実行します。
コアコンポーネント
Tryブロック
例外を生成する可能性のあるコードを含みます。エラーが発生しない限り実行は正常に進行し、エラーが発生すると制御は直ちにcatchブロックに移ります。
Catchブロック
tryブロックからスローされた例外を処理します。例外の詳細(タイプ、メッセージ、スタックトレース)を捕捉し、回復ロジック、ログ記録、またはユーザー通知を実装します。
Finallyブロック
例外が発生したかどうかに関係なく実行され、リソースのクリーンアップ(ファイルのクローズ、接続の解放)が一貫して行われることを保証します。
例外オブジェクト
例外タイプ、説明メッセージ、エラーが発生した場所を示すスタックトレースを含むエラー情報を含みます。
実装パターン
JavaScript
try {
let data = JSON.parse(userInput);
processData(data);
} catch (error) {
console.error("Parse failed:", error.message);
showUserError("Invalid data format");
} finally {
cleanup();
}
重要なポイント:
- 構文エラーではなく、実行時エラーのみを捕捉
- 非同期エラーは非同期コンテキスト内での処理が必要
throwを使用して、より高レベルのハンドラーに例外を再スロー
C# (.NET)
try
{
var result = ProcessInput(data);
}
catch (FormatException ex)
{
LogError(ex, "Format error");
NotifyUser("Invalid format");
}
catch (Exception ex) when (ex is IOException || ex is UnauthorizedAccessException)
{
LogError(ex, "System error");
}
finally
{
CleanupResources();
}
機能:
- 特定の例外タイプに対する複数のcatchブロック
when句による例外フィルターthrow;は再スロー時に元のスタックトレースを保持
Python
try:
result = process_data(input_value)
except ValueError as e:
logger.error(f"Value error: {e}")
handle_invalid_input()
except Exception as e:
logger.error(f"Unexpected error: {e}")
raise
finally:
cleanup_resources()
Java
try {
int value = Integer.parseInt(input);
processValue(value);
} catch (NumberFormatException e) {
logger.error("Invalid number: " + input, e);
notifyUser("Please enter a valid number");
} finally {
cleanup();
}
UiPath RPA
Try-Catchアクティビティ:
- Tryシーケンスには自動化ステップが含まれる
- Catchシーケンスは例外発生時に起動
- Finallyシーケンスはクリーンアップを保証
グローバル例外ハンドラー:
プロジェクト全体で未処理の例外を捕捉します。適切に構造化されていない場合、ローカルのTry-Catchブロックをオーバーライドする可能性があるため、慎重に設定してください。
エラーハンドラーを使用すべき場合
適切な使用ケース:
- 外部サービス呼び出し(API、データベース、ネットワークリクエスト)
- アクセスまたはフォーマットの問題が発生する可能性のあるファイルI/O操作
- 検証ですべてのエラーを捕捉できないユーザー入力処理
- システム間の統合ポイント
- 保証されたクリーンアップが必要なリソース割り当て
不適切な使用ケース:
- 通常の制御フロー(代わりにif/elseを使用)
- 予測可能な検証(操作前に条件をチェック)
- 例外的な状況のないパフォーマンスクリティカルなコード
- 適切な入力検証の代替
ベストプラクティス
例外タイプを具体的に指定する
広範な基底クラスではなく、可能な限り最も具体的な例外タイプを捕捉します。これにより、ターゲットを絞った処理が可能になり、予期しないエラーのマスキングを防ぎます。
Catchブロックを空のままにしない
サイレント障害はバグを隠し、デバッグを複雑にします。常に適切なコンテキストで例外をログ記録、処理、または再スローしてください。
完全なエラー情報をログに記録する
効果的なトラブルシューティングのために、例外タイプ、メッセージ、スタックトレース、および関連するコンテキスト(ユーザーID、入力値、システム状態)を捕捉します。
リソースクリーンアップにFinallyを使用する
成功または失敗に関係なく、リソースの解放(ファイルハンドル、データベース接続、ロック)を保証します。
Tryブロックのスコープを制限する
ワークフロー全体ではなく、リスクのある操作のみをラップします。小さなスコープはエラーソースを明確にし、処理をより正確にします。
処理できない場合は再スロー
catchブロックが例外を意味のある形で解決できない場合は、throw;(C#)またはthrow(Python/Java)を使用して再スローし、スタックトレースを保持し、より高レベルの処理を可能にします。
プラットフォーム固有の考慮事項:
- JavaScript: async/awaitエラーハンドリングのために非同期関数内でTry-Catchを使用
- Node.js: プロセスレベルのエラーハンドラーを実装するが、致命的なエラー時にはプロセスを再起動
- C#: 高度なシナリオには例外フィルターを活用
- UiPath: 特にループ内では、個々のリスクのあるアクティビティを別々のTry-Catchブロックに配置
一般的なアンチパターン
制御フローに例外を使用する
if/elseロジックをTry-Catchで置き換えないでください。例外にはパフォーマンスコストがかかり、コードの可読性が低下します。
捕捉範囲が広すぎる
アプリケーション境界以外では、基底のExceptionまたはThrowableを捕捉しないでください。広範な捕捉は予期しないエラーをマスクし、デバッグを複雑にします。
空のCatchブロック
try { riskyOperation(); }
catch { } // 絶対にこれをしないでください
このパターンはエラーを静かに飲み込み、下流の問題を引き起こすまで問題を見えなくします。
過度のネスト
深いTry-Catchのネストは複雑なエラーパスを作成します。明確なエラー契約を持つ明確に定義された関数への抽出を優先してください。
高度なシナリオ
例外のバブリング
未処理の例外は捕捉されるまでコールスタックを伝播します。すべての関数ではなく、適切なアーキテクチャレイヤーでエラーハンドリングを設計してください。
非同期エラーハンドリング
JavaScriptの非同期コールバックは、コールバックコンテキスト内でTry-Catchを必要とします。プロミスの場合は、.catch()ハンドラーまたはasync/awaitでのTry-Catchを使用します。
RPAグローバルハンドラー vs ローカルハンドラー
UiPathのグローバル例外ハンドラーは、ローカルのTry-Catchブロックの前にエラーを捕捉できます。ローカルハンドリングが優先されるように、単一のリスクのあるアクティビティを専用のTry-Catchブロックに分離してください。
再スローの考慮事項
再スロー時には、元のスタックトレースを保持してください。C#では、完全なエラーコンテキストを維持するためにthrow ex;ではなくthrow;を使用します。
パフォーマンスへの影響
例外ハンドリングには実行時コストがかかります。エラーが予想される密なループや高頻度の操作でTry-Catchを使用しないでください。代わりに最初に検証してください。
トラブルシューティングガイドライン
非同期エラーハンドリングの欠落
非同期コンテキスト(コールバック、プロミスチェーン、非同期関数)内でのTry-Catch配置を確認してください。
サイレント障害
空のcatchブロックまたはログを記録しないcatchをコードベースで検索してください。包括的なエラーログを実装してください。
不明確なエラーソース
Tryブロックのスコープを確認してください。過度に大きなブロックはエラーの起源を不明瞭にします。スコープを特定のリスクのある操作に縮小してください。
失われたスタックトレース
再スロー構文を確認してください。元のトレースを保持するために、C#ではthrow;または他の言語で同等のものを使用してください。
RPAハンドラーの競合
グローバル例外ハンドラーの設定が、意図したローカルのTry-Catch動作をオーバーライドしていないことを確認してください。
重要なポイント
Try-Catchエラーハンドラーは、例外を捕捉し、意図的な回復応答を可能にすることで、制御不能なクラッシュを防ぎます。通常のプログラムフローではなく、例外的で予測不可能なシナリオに使用してください。常に例外をログ記録またはエスカレートしてください。catchブロックを空のままにしないでください。正確な処理のために特定の例外タイプを捕捉してください。プラットフォーム固有の非同期エラーハンドリング要件を理解してください。保証されたリソースクリーンアップにfinallyブロックを使用してください。高価な操作の前に入力を検証することで、包括的なエラーハンドリングとパフォーマンスの考慮事項のバランスを取ってください。本番環境の信頼性を確保するために、成功パスと同じくらい徹底的にエラーパスをテストしてください。
参考文献
- MDN: try…catch (JavaScript)
- JavaScript.info: Error Handling
- Microsoft Learn: Exception Handling in C#
- Stack Overflow: Try/Catch Best Practices (C#)
- Software Engineering Stack Exchange: Try/Catch as Logical Operators
- Node.js: Cluster & Error Handling
- W3Schools: Java Try…Catch
- UiPath Forum: Best Practices Try Catch
- UiPath Forum: Global Exception Handler vs Try-Catch
- UiPath Forum: Exception Handling in Large Projects
- Stackify: 9 Best Practices for Java Exceptions
- Baeldung: Java Exceptions
- UiPath Official Docs: Try Catch