在dart中异步任务使用.then()接收结果,这时若发生错误还能被try-catch捕获到吗?
很多刚开始接触Dart的同学都会有这样的疑问,
在 Dart 中,使用 .then()
方法接收异步任务的结果时,如果发生错误,可以通过 .catchError()
方法捕获异常。这样你就可以使用 try-catch
块来捕获和处理这些错误。
下面是一个简单的示例,演示了如何使用 .then()
和 catchError()
来捕获异步任务的错误:
void main() {
performAsyncTask().then((result) {
// 处理成功的结果
print('任务成功完成: $result');
}).catchError((error) {
// 处理发生的错误
print('发生错误: $error');
});
}
Future<String> performAsyncTask() async {
// 模拟一个异步任务
await Future.delayed(Duration(seconds: 2));
// 抛出一个异常
throw Exception('发生错误');
}
在上面的示例中,performAsyncTask()
是一个异步任务,它在2秒后抛出一个异常。我们通过 .then()
方法接收任务的结果,并通过 .catchError()
方法捕获任务发生的错误。在 .catchError()
中,你可以执行适当的错误处理操作。
运行上面的代码,你将看到控制台输出:
发生错误: Exception: 发生错误
通过使用 .catchError()
,我们能够捕获到异步任务发生的错误,并进行相应的处理。
catchError 方法的各个参数都是啥作用?
在 Dart 中,.catchError()
方法有两个可选的参数,它们分别是 onError
和 test
。
-
onError
参数是一个回调函数,用于处理捕获到的错误。当异步任务发生错误时,错误对象将作为参数传递给这个回调函数。你可以在这个回调函数中执行适当的错误处理逻辑,例如打印错误信息、记录日志或执行其他操作。 -
test
参数是一个可选的谓词函数(predicate function),用于判断是否要捕获特定类型的错误。如果你只想捕获特定类型的错误,可以使用这个参数。谓词函数接收一个错误对象作为参数,并返回一个布尔值,用于判断是否要捕获该错误。如果test
参数返回true
,那么错误将被捕获并传递给onError
回调函数进行处理;如果test
参数返回false
,那么错误将继续传递给上游的错误处理机制(如全局错误处理或调用链中的其他.catchError()
)。
下面是一个示例,演示了如何使用 .catchError()
的参数:
void main() {
performAsyncTask().then((result) {
print('任务成功完成: $result');
}).catchError((error, stackTrace) {
print('发生错误: $error');
print('堆栈跟踪: $stackTrace');
}, test: (error) {
// 捕获特定类型的错误
return error is CustomException;
});
}
Future<String> performAsyncTask() async {
await Future.delayed(Duration(seconds: 2));
// 抛出一个自定义异常
throw CustomException('发生自定义异常');
}
class CustomException implements Exception {
final String message;
CustomException(this.message);
String toString() {
return 'CustomException: $message';
}
}
在上面的示例中,我们通过 test
参数将错误类型限定为 CustomException
。这意味着只有当发生 CustomException
类型的错误时,才会调用 onError
回调函数进行处理。
带有 catchError
的 .then()
方法可以捕获到异步任务发生的错误,并提供灵活的错误处理机制。你可以根据需要使用 onError
和 test
参数来自定义错误处理逻辑。