使用 on 捕获异常
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 40 课,共 65 课。
虽然基本的 try-catch 语句块可以捕获发生的任何异常,但有时你需要以不同方式处理不同类型的异常。on 关键字可以让你捕获特定类型的异常,并针对每种异常提供相应的处理方式。
你可以使用 on 后跟异常类型来捕获特定异常,而不是用通用的 catch 捕获所有异常。这样,你就能更好地控制程序如何应对不同的错误情况。
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}在这个示例中,代码专门捕获 FormatException,当尝试将无效文本解析为数字时,就会发生这种异常。这样,你就可以提供清晰易懂的提示,直接说明问题,而不是显示可能让用户感到困惑的通用错误消息。
你还可以组合多个 on 代码块,以适当的响应处理不同类型的异常,让错误处理既精准又易于用户理解。
挑战
简单创建一个程序,演示如何使用 on 关键字捕获特定异常。你的程序将处理不同类型的用户输入,并针对特定异常类型显示相应的错误消息。
- 读取一个字符串输入,表示数学表达式类型(
"parse"、"divide"或"access") - 读取一个字符串输入,表示第一个值
- 读取一个字符串输入,表示第二个值(如果适用)
- 根据表达式类型,执行相应的操作,并使用特定的异常处理方式:
- 对于
"parse":使用int.parse()将第一个值转换为整数,并专门捕获FormatException - 对于
"divide":将两个值解析为整数并执行除法,解析出错时捕获FormatException - 对于
"access":创建一个包含第一个值的列表,并访问第二个值指定的索引,索引无效时捕获RangeError - 按照下方显示的准确格式输出结果或特定错误消息
例如,如果输入是 "parse"、"42"、"unused",你的程序应输出:
Operation: parse
Input: 42
Parsing successful!
Result: 42如果输入是 "parse"、"xyz"、"unused",你的程序应输出:
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer如果输入是 "divide"、"10"、"2",你的程序应输出:
Operation: divide
Values: 10, 2
Division successful!
Result: 5如果输入是 "divide"、"10"、"abc",你的程序应输出:
Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers如果输入是 "access"、"hello"、"1",你的程序应输出:
Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0你的程序必须使用独立的 try-catch 块和 on 关键字,分别捕获 FormatException 和 RangeError。每种异常类型都应有各自的错误消息,清楚说明出了什么问题。对于 "access" 操作,创建一个仅包含第一个输入值的列表,并尝试访问第二个输入值指定的索引。
亲手试试
import 'dart:io';
void main() {
// 读取输入
String? operation = stdin.readLineSync();
String? firstValue = stdin.readLineSync();
String? secondValue = stdin.readLineSync();
// 显示操作信息
print('Operation: $operation');
// TODO:在下方编写你的代码
// 使用 try-catch 代码块和 'on' 关键字处理特定异常
// 处理解析和除法操作中的 FormatException
// 处理访问操作中的 RangeError
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器