'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;
}throwキーワードは、プログラム内でいつ、どのようにエラーを報告するかを制御できるようにし、無効な条件を処理する際に、関数をより堅牢で予測可能なものにします。
チャレンジ
簡単無効な条件が検出されたときに throw キーワードを使用して手動で例外を発生させ、入力バリデーションを実装するプログラムを作成してください。このチャレンジでは、独自の関数内でエラーを通知するために throw を使用する方法についての理解をテストします。
以下の入力が提供されます:
- ユーザーが選択したユーザー名を表す文字列
username - ユーザーの年齢を表す整数
age
プログラムは以下の処理を行う必要があります:
- 文字列と整数をパラメータとして受け取る
validateUserという名前の関数を作成します - 関数内で、ユーザー名が空(長さが0)かどうかを確認します
- ユーザー名が空の場合、文字列
"Username cannot be empty"をthrowします - 年齢が13歳未満かどうかを確認します
- 年齢が13歳未満の場合、文字列
"Age must be at least 13"をthrowします - 両方のバリデーションを通過した場合は、
"User validation successful"と出力します - メイン関数内で、入力値を使用して
validateUserを呼び出します tryブロックを使用して関数を呼び出し、catchブロックを使用してスローされた文字列例外を処理します
以下の正確な出力形式を使用してください:
バリデーションに成功した場合:
User validation successfulバリデーションエラーの場合:
Validation error: [error_message]throw を使用すると、プログラムは即座に現在の関数の実行を停止し、一致する catch ブロックを探すことに注意してください。catch ブロックでは、スローされた文字列リテラルを処理するために const char* 型を指定する必要があります。最初のバリデーションが失敗した場合、関数は例外をスローし、2番目の条件のチェックは続行しません。
チートシート
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;
}整数、文字列、カスタムオブジェクトなど、さまざまな型の値を例外としてスローできます。スローされた文字列リテラルを処理するには、catchブロックでconst char*を使用します。
自分で試してみよう
#include <iostream>
#include <string>
using namespace std;
int main() {
// 入力を読み込む
string username;
int age;
cin >> username;
cin >> age;
// TODO: ここにコードを記述してください
// validateUser 関数を作成し、バリデーションロジックを実装してください
// 例外を処理するために try-catch ブロックを使用してください
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。