Menu
Coddy logo textTech

例外のスロー

CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 42/65。

コード内で独自の例外条件を作成する必要がある場合があります。throw キーワードを使用すると、プログラムが継続を許可すべきではない状況に遭遇したときに、手動で例外を発生させることができます。

例外を throw するとき、本質的には「すべてを停止してください。ここで何かが間違っています」と言っていることになります。これは、入力のバリデーションや関数内でのルールの適用に役立ちます。単純な文字列メッセージをスローすることも、より具体的な例外タイプを作成することもできます。

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

この例では、負の年齢を渡そうとすると、関数は即座に説明的なメッセージとともに例外をスローします。これにより、無効なデータで関数の残りの部分が実行されるのを防ぎ、コードの信頼性を高め、デバッグを容易にします。

例外をスローすることは、重要な操作を続行する前に入力を検証する必要がある関数において、特に有用です。

challenge icon

チャレンジ

簡単

無効なデータが検出されたときに例外をスローするカスタムバリデーション関数を実装することで、ユーザーアカウント情報を検証するプログラムを作成してください。プログラムは複数のアカウントフィールドをチェックし、バリデーションの失敗に応じて特定のメッセージをスローする必要があります。

  1. ユーザー名を表す文字列入力を読み込む
  2. メールアドレスを表す文字列入力を読み込む
  3. 年齢を表す文字列入力を読み込む
  4. パスワードを表す文字列入力を読み込む
  5. ユーザー名が有効かどうかをチェックする validateUsername という関数を作成します:
    • ユーザー名が空、または3文字未満の場合は、次の例外をスローします: "Username must be at least 3 characters long"
    • ユーザー名にスペースが含まれている場合は、次の例外をスローします: "Username cannot contain spaces"
    • バリデーションに合格した場合は、次のように出力します: "Username validation passed"
  6. メールアドレスが有効かどうかをチェックする validateEmail という関数を作成します:
    • メールアドレスに @ 記号が含まれていない場合は、次の例外をスローします: "Email must contain @ symbol"
    • メールアドレスの @ 記号の後にドット . が含まれていない場合は、次の例外をスローします: "Email must contain a valid domain"
    • バリデーションに合格した場合は、次のように出力します: "Email validation passed"
  7. 年齢が有効かどうかをチェックする validateAge という関数を作成します:
    • int.parse() を使用して年齢の文字列を整数に変換します
    • 年齢が13歳未満の場合は、次の例外をスローします: "Age must be at least 13 years old"
    • 年齢が120歳より大きい場合は、次の例外をスローします: "Age must be realistic (under 120)"
    • バリデーションに合格した場合は、次のように出力します: "Age validation passed"
  8. パスワードが有効かどうかをチェックする validatePassword という関数を作成します:
    • パスワードが8文字未満の場合は、次の例外をスローします: "Password must be at least 8 characters long"
    • バリデーションに合格した場合は、次のように出力します: "Password validation passed"
  9. 各バリデーション関数を順番に呼び出し、発生した例外を処理します
  10. 以下の形式で結果を表示します

例えば、入力が "john", "john@email.com", "25", "password123" の場合、プログラムは次のように出力する必要があります:

Account Validation System
=========================
Validating username: john
Username validation passed
Validating email: john@email.com
Email validation passed
Validating age: 25
Age validation passed
Validating password: password123
Password validation passed
=========================
All validations passed successfully!
Account created for user: john

入力が "jo", "john@email.com", "25", "password123" の場合、プログラムは次のように出力する必要があります:

Account Validation System
=========================
Validating username: jo
Validation Error: Username must be at least 3 characters long
Account creation failed due to validation errors

入力が "john doe", "johnemail.com", "12", "pass" の場合、プログラムは次のように出力する必要があります:

Account Validation System
=========================
Validating username: john doe
Validation Error: Username cannot contain spaces
Account creation failed due to validation errors

プログラムは、ユーザー名、メールアドレス、年齢、パスワードの順序で各バリデーション関数を呼び出す必要があります。いずれかのバリデーションが失敗した時点でバリデーションを停止し、エラーメッセージを表示してください。throw キーワードを使用して、上記の特定のエラーメッセージを含む例外を手動で発生させてください。各バリデーション関数は、それぞれのフィールドをチェックし、バリデーションに失敗した場合は例外をスローし、合格した場合は成功メッセージを出力する必要があります。

チートシート

throwキーワードを使用すると、プログラムが無効な条件に遭遇したときに手動で例外を発生させることができます:

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

throwで例外を発生させると、プログラムはその時点で実行を停止します。これは、入力の検証や関数内でのルールの適用に役立ち、コードの信頼性を高め、デバッグを容易にします。

単純な文字列メッセージをスローすることも、より具体的な例外タイプを作成することもできます。例外のスローは、重要な操作を続行する前に入力をチェックする必要がある検証関数において特に価値があります。

自分で試してみよう

import 'dart:io';

void main() {
  // 入力を読み込む
  String? username = stdin.readLineSync();
  String? email = stdin.readLineSync();
  String? age = stdin.readLineSync();
  String? password = stdin.readLineSync();
  
  print("Account Validation System");
  print("=========================");
  
  try {
    // TODO: validateUsername関数を作成し、ここで呼び出す
    print("Validating username: $username");
    
    // TODO: validateEmail関数を作成し、ここで呼び出す
    print("Validating email: $email");
    
    // TODO: validateAge関数を作成し、ここで呼び出す
    print("Validating age: $age");
    
    // TODO: validatePassword関数を作成し、ここで呼び出す
    print("Validating password: $password");
    
    // TODO: すべてのバリデーションが成功した場合、成功メッセージを表示する
    print("=========================");
    print("All validations passed successfully!");
    print("Account created for user: $username");
    
  } catch (e) {
    // TODO: 例外を処理し、エラーメッセージを表示する
    print("Validation Error: $e");
    print("Account creation failed due to validation errors");
  }
}

// TODO: ここにバリデーション関数を記述する
quiz icon腕試し

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

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