キャッチオールハンドラ
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 52/56。
場合によっては、プログラムで、計画していた特定の exception 型には当てはまらない unexpected な error が発生することがあります。catch-all ハンドラー catch(...) は安全網として機能し、より具体的な catch ブロックで処理されなかったあらゆる exception を捕捉します。
catch-all ハンドラーは、特定の例外型を指定する代わりに 3 つのドット (...) を使用します。C++ は catch ブロックを順番にチェックするため、他のすべての catch ブロックの後に配置する必要があります。
try {
// さまざまな例外をスローする可能性のあるコード
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}catch-all ハンドラーは、前の blocks で caught されなかったあらゆる exception type に対するフォールバックとして機能します。これは、予期していなかった exception を might throw するコードを扱う場合に特に便利で、プログラムが unexpected error によってクラッシュしないようにします。
catch-all ブロックでは exception の具体的な詳細にアクセスすることはできませんが、汎用的な error メッセージを提供し、プログラムをスムーズに実行し続けるためのクリーンアップ処理を実行できます。
チャレンジ
簡単キャッチオールハンドラーを含む複数の catch ブロックを使用して、包括的な例外処理を実演するプログラムを作成してください。このチャレンジでは、特定の例外型と、あらかじめ定義されたカテゴリに当てはまらない予期しないエラーの両方を処理する方法についての理解を確認します。
次の入力が提供されます。
- 実行するテストの種類を表す文字列
testType("string_convert"、"math_operation"、"array_access"、または"unknown_error") - 操作の主要なデータとして使用される文字列
value1 - 一部の操作で二次データとして使用される文字列
value2
プログラムでは、次の処理を行ってください。
- 3つの文字列パラメーターを受け取る
performTestという名前の関数を作成する - 関数内で、異なるテストの種類を処理するために if-else 構造を使用する。
- testType が
"string_convert"の場合:std::stoiを使用して value1 を整数に変換し、それを出力する - testType が
"math_operation"の場合:std::stoiを使用して value1 と value2 の両方を整数に変換し、次に value1 を value2 で割って結果を出力する - testType が
"array_access"の場合:文字列"Programming"を作成し、std::stoiを使用して value1 を整数のインデックスに変換し、次にstr.at(index)を使用してそのインデックスの文字にアクセスし、それを出力する。.at()メソッドは、インデックスが無効な場合に自動的にstd::out_of_rangeをスローするため、手動で範囲を確認する必要はありません - testType が
"unknown_error"の場合:整数値999をスローする - main 関数内で、
tryブロックの中からperformTestを呼び出す - 例外を次の正確な順序で処理するために、複数の
catchブロックを使用する。 - 1番目:無効な文字列から数値への変換に対する
std::invalid_argument& - 2番目:大きすぎる数値、または文字列のインデックスが範囲外の場合に対する
std::out_of_range& - 3番目:その他の例外型に対するキャッチオールハンドラーとしての
catch(...)
次の正確な出力形式を使用してください。
正常な操作の場合:
Success: [result_value]異なる例外型の場合:
Invalid argument caught
Out of range caught
Unknown exception caughtキャッチオールハンドラー catch(...) は最後に配置する必要があることに注意してください。C++ は catch ブロックを順番に確認するためです。このハンドラーは、前の特定の catch ブロックで処理されなかった任意の例外型を捕捉します。これには、"unknown_error" のケースでスローされる整数例外も含まれます。キャッチオールハンドラーは、既知の例外型に対する特定の処理を可能にしながら、予期しないエラーに対する安全網を提供します。
自分で試してみよう
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: ここにコードを書いてください - performTest関数を作成する
int main() {
// 入力を読み取る
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: 以下にコードを書いてください - try-catchブロックを実装し、performTestを呼び出す
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ