抛出异常
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 42 课,共 65 课。
有时,你需要在代码中创建自己的错误条件。throw 关键字可以让你在程序遇到不应继续执行的情况时,手动触发异常。
当你 throw 一个异常时,实际上是在说:“停止一切,这里出了问题。”这对于验证输入或在函数中强制执行规则很有用。你可以抛出一条简单的字符串消息,也可以创建更具体的异常类型。
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}在这个示例中,如果有人尝试传入负数年龄,函数会立即抛出异常,并附上描述性消息。这样可以防止函数的其余部分使用无效数据运行,让你的代码更可靠,也更容易调试。
对于需要在执行重要操作前验证输入的函数来说,抛出异常尤其有用。
挑战
简单编写一个程序,通过实现自定义验证函数来验证用户账户信息,并在检测到无效数据时抛出异常。程序应检查多个账户字段,并针对不同的验证失败情况抛出特定的错误消息。
- 读取一个表示用户名的字符串输入
- 读取一个表示电子邮件地址的字符串输入
- 读取一个表示年龄的字符串输入
- 读取一个表示密码的字符串输入
- 创建一个名为
validateUsername的函数,用于检查用户名是否有效: - 如果用户名为空或少于 3 个字符,则抛出异常:
"Username must be at least 3 characters long" - 如果用户名包含空格,则抛出异常:
"Username cannot contain spaces" - 如果验证通过,则打印:
"Username validation passed" - 创建一个名为
validateEmail的函数,用于检查电子邮件地址是否有效: - 如果电子邮件地址不包含
@符号,则抛出异常:"Email must contain @ symbol" - 如果
@符号后没有点号.,则抛出异常:"Email must contain a valid domain" - 如果验证通过,则打印:
"Email validation passed" - 创建一个名为
validateAge的函数,用于检查年龄是否有效: - 使用
int.parse()将年龄字符串转换为整数 - 如果年龄小于 13,则抛出异常:
"Age must be at least 13 years old" - 如果年龄大于 120,则抛出异常:
"Age must be realistic (under 120)" - 如果验证通过,则打印:
"Age validation passed" - 创建一个名为
validatePassword的函数,用于检查密码是否有效: - 如果密码少于 8 个字符,则抛出异常:
"Password must be at least 8 characters long" - 如果验证通过,则打印:
"Password validation passed" - 依次调用每个验证函数,并处理发生的任何异常
- 按照下方所示的准确格式显示结果
例如,如果输入为 "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: 在这里编写你的验证函数这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器