Menu
Coddy logo textTech

'throw' キーワード

CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 50/56。

他の関数が throw した exceptions を単に捕捉するのではなく、自分のコードで error が発生したことを知らせる必要がある場合があります。throw キーワードを使用すると、プログラムが問題を検出したときに、手動で例外を発生させることができます。

exceptions としてさまざまな種類の値(整数、文字列、さらにはカスタムオブジェクト)を throw できます。基本的な構文は次のとおりです。

if (someErrorCondition) {
    throw "Error message";  // 文字列リテラルをスローする
}

throw を使用すると、プログラムは現在の function の実行を直ちに停止し、throw された値を処理できる catch ブロックを探します。これは、input を検証したり、プログラムの通常の実行中には発生すべきでない条件を確認したりする場合に特に役立ちます。

無効な入力を検出したときに例外をスローする実践的な例を紹介します。

void checkAge(int age) {
    if (age < 0) {
        throw "Age cannot be negative!";
    }
    std::cout << "Age is valid: " << age << std::endl;
}

throwキーワードを使うと、プログラムでエラーを報告するタイミングと方法を制御できるため、無効な条件を扱う際に関数をより堅牢で予測しやすくできます。

challenge icon

チャレンジ

簡単

throwキーワードを使用して、無効な条件が検出されたときに例外を手動で発生させる入力検証を実装するプログラムを作成してください。この課題では、自分で作成した関数内でエラーを通知するためにthrowを使用する方法の理解度を確認します。

次の入力が提供されます。

  • ユーザーが選択したユーザー名を表す文字列username(この行は empty の場合があります)
  • ユーザーの年齢を表す整数age

プログラムでは次の処理を行ってください。

  1. 文字列と整数をパラメーターとして受け取る、validateUserという名前の function を Create する
  2. function 内で、username が empty(length が 0)かどうかを確認する
  3. username が empty の場合、文字列"Username cannot be empty"throwする
  4. age が 13 未満かどうかを確認する
  5. age が 13 未満の場合、文字列"Age must be at least 13"throwする
  6. 両方の validation に成功した場合、"User validation successful"を出力する
  7. main function で、入力値を使用してvalidateUserを呼び出す
  8. tryブロックを使用して function を呼び出し、catchブロックを使用して発生した string exceptions を handle する

次の正確な出力形式を使用してください。

validation に成功した場合:

User validation successful

validation エラーの場合:

Validation error: [error_message]

throwを使用すると、プログラムは現在の function の実行を直ちに停止し、一致するcatchブロックを探すことに注意してください。catchブロックでは、throw された string literals を handle するために、型const char*を指定する必要があります。最初の validation が失敗すると、function は例外を throw し、2 番目の条件の確認を続行しません。

自分で試してみよう

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 入力を読み取る
    string username;
    int age;
    getline(cin, username);
    cin >> age;
    
    // TODO: ここにコードを書いてください
    // validateUser関数を作成し、検証ロジックを実装する
    // 例外を処理するためにtry-catchブロックを使用する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ