Menu
CoddyTech

抛出异常

本课属于 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 关键字手动触发异常,并使用上方所示的特定错误消息。每个验证函数都应检查对应的字段,验证失败时抛出异常,验证通过时则打印成功消息。

亲手试试

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自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器