Dart中如何优雅地捕获异步任务的异常

在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() 方法有两个可选的参数,它们分别是 onErrortest

  1. onError 参数是一个回调函数,用于处理捕获到的错误。当异步任务发生错误时,错误对象将作为参数传递给这个回调函数。你可以在这个回调函数中执行适当的错误处理逻辑,例如打印错误信息、记录日志或执行其他操作。

  2. 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() 方法可以捕获到异步任务发生的错误,并提供灵活的错误处理机制。你可以根据需要使用 onErrortest 参数来自定义错误处理逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值