'throw' キーワード
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 50/56。
他の関数が投げた例外を捕捉するだけでなく、自分のコードでエラーが発生したことを示す必要がある場合もあります。throw キーワードを使うと、プログラムが問題を検出したときに手動で例外を発生させることができます。
例外として、整数、文字列、カスタムオブジェクトなど、さまざまな型の値をスローできます。基本的な構文は次のとおりです。
if (someErrorCondition) {
throw "Error message"; // 文字列リテラルをスローする
}throwを使うと、プログラムは現在の関数の実行を直ちに停止し、投げられた値を処理できるcatchブロックを探します。これは、入力の検証や、通常のプログラム実行中には発生すべきでない条件の確認に特に役立ちます。
無効な入力を検出したときに例外をスローする実践的な例を見てみましょう。
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}呼び出し元は呼び出しを try ブロックで囲みます。スローされた文字列リテラルの型は const char* なので、catch ブロックではその型を指定し、パラメーターにメッセージを格納します:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// 出力: Error: Age cannot be negative!throwキーワードを使うと、プログラムでエラーを報告するタイミングや方法を制御できます。これにより、無効な条件を扱う際に、関数の堅牢性と予測可能性を高められます。
チャレンジ
簡単無効な条件が検出されたときに例外を手動で発生させるため、throw キーワードを使って入力検証を実装するプログラムを作成してください。この課題では、自分で作成した関数内でエラーを通知するために throw を使う方法の理解度を確認します。
次の入力が与えられます。
- ユーザーが選んだユーザー名を表す文字列
username(この行は空の場合があります) - ユーザーの年齢を表す整数
age
プログラムでは、次の処理を行ってください。
- 文字列と整数を引数として受け取る、
validateUserという名前の関数を作成する - 関数内で、ユーザー名が空(長さが 0)かどうかを確認する
- ユーザー名が空の場合は、文字列
"Username cannot be empty"をthrowする - 年齢が 13 未満かどうかを確認する
- 年齢が 13 未満の場合は、文字列
"Age must be at least 13"をthrowする - 両方の検証に成功した場合は、
"User validation successful"を出力する - main 関数で、入力値を使って
validateUserを呼び出す - 関数の呼び出しには
tryブロックを使い、発生した文字列の例外を処理するにはcatchブロックを使う
次の出力形式を厳密に使用してください。
検証に成功した場合:
User validation successful検証エラーの場合:
Validation error: [error_message]throw を使うと、プログラムは現在の関数の実行をただちに中断し、一致する catch ブロックを探します。catch ブロックでは、throw された文字列リテラルを処理するために型 const char* を指定してください。最初の検証に失敗すると、関数は例外を発生させ、2つ目の条件の確認には進みません。
自分で試してみよう
#include <iostream>
#include <string>
using namespace std;
// TODO: main の上のここに validateUser 関数を書く
// string 型の username と int 型の age を受け取り、チェックに失敗した場合は文字列リテラルをスローする
int main() {
// 入力を読み取る
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: try ブロック内で validateUser を呼び出す
// そして catch (const char* error) でスローされたメッセージを受け取る
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ