错误处理
异常
#您的 Dart 代码可以抛出和捕获异常。异常是指示某些意外情况发生的错误。如果未捕获异常,则引发异常的 隔离区 将被挂起,并且通常隔离区及其程序将被终止。
与 Java 不同,Dart 的所有异常都是未经检查的异常。方法不声明可能抛出的异常,并且您不需要捕获任何异常。
Dart 提供了 Exception
和 Error
类型,以及许多预定义的子类型。当然,您可以定义自己的异常。但是,Dart 程序可以抛出任何非空对象(不仅仅是 Exception 和 Error 对象)作为异常。
抛出
#以下是如何抛出或引发异常的示例
throw FormatException('Expected at least 1 section');
您还可以抛出任意对象
throw 'Out of llamas!';
由于抛出异常是一个表达式,因此您可以在 => 语句中抛出异常,以及在允许表达式的任何其他地方抛出异常
void distanceTo(Point other) => throw UnimplementedError();
捕获
#捕获或捕获异常会阻止异常传播(除非您重新抛出异常)。捕获异常为您提供了一个处理异常的机会
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
要处理可能抛出多种类型的异常的代码,您可以指定多个 catch 子句。第一个与抛出的对象的类型匹配的 catch 子句将处理异常。如果 catch 子句未指定类型,则该子句可以处理任何类型的抛出对象
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
如前面的代码所示,您可以使用on
或catch
或两者兼而有之。当您需要指定异常类型时,使用on
。当您的异常处理程序需要异常对象时,使用catch
。
您可以为catch()
指定一个或两个参数。第一个是抛出的异常,第二个是堆栈跟踪(一个 StackTrace
对象)。
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
要部分处理异常,同时允许其传播,请使用rethrow
关键字。
void misbehave() {
try {
dynamic foo = true;
print(foo++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
最终
#要确保某些代码无论是否抛出异常都运行,请使用finally
子句。如果没有catch
子句与异常匹配,则在finally
子句运行后传播异常
try {
breedMoreLlamas();
} finally {
// Always clean up, even if an exception is thrown.
cleanLlamaStalls();
}
finally
子句在任何匹配的catch
子句之后运行
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}
要了解更多信息,请查看 核心库异常文档。
断言
#在开发过程中,使用断言语句 - assert(<condition>, <optionalMessage>);
- 如果布尔条件为假,则中断正常执行。
// Make sure the variable has a non-null value.
assert(text != null);
// Make sure the value is less than 100.
assert(number < 100);
// Make sure this is an https URL.
assert(urlString.startsWith('https'));
要将消息附加到断言,请将字符串作为第二个参数添加到assert
(可选地带 尾随逗号)。
assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');
assert
的第一个参数可以是任何解析为布尔值的表达式。如果表达式的值为真,则断言成功,执行继续。如果为假,则断言失败,并抛出一个异常(一个 AssertionError
)。
断言何时生效?这取决于您使用的工具和框架
- Flutter 在 调试模式 下启用断言。
- 仅开发时使用的工具(例如
webdev serve
)通常默认启用断言。 - 某些工具(例如
dart run
和dart compile js
)通过命令行标志支持断言:--enable-asserts
。
在生产代码中,断言被忽略,并且不会评估assert
的参数。
除非另有说明,否则本网站上的文档反映了 Dart 3.5.3。页面上次更新于 2024-02-07。 查看源代码 或 报告问题。