dart - future 的执行会导致未处理的异常

标签 dart future unhandled-exception

import 'dart:async';

void main() {
  divide(1, 0).then((result) => print('1 / 0 = $result'))
    .catchError((error) => print('Error occured during division: $error'));
}

Future<double> divide(int a, b) {
  if (b == 0) {
    throw new Exception('Division by zero');
  }
  return new Future.value(a/b);
}

目前我正在学习如何在 Dart 中使用 futures,但我被困在这样一个简单的例子上。当用户尝试除以零时,我的 future 会抛出异常。但是,.catchError 不处理我的异常。我用堆栈跟踪得到了未处理的异常。我很确定我遗漏了一些明显的东西,但无法理解到底是什么。

据我了解,还有另一种处理错误的方法:

divide(1, 0).then((result) => print('1 / 0 = $result'),
    onError: (error) => print('Error occured during division: $error'));

使用命名可选参数 - onError。这样做仍然会导致未处理的异常。

我想再澄清一件事。我对吗? - 这两种方法之间的唯一区别是 .catchError() 还处理内部 future 抛出的错误(在外部 future 的 then() 方法内部调用的 future)而 onError 只捕获外部 future 抛出的错误?

德米特里

谢谢。

最佳答案

您的错误处理无效,因为错误是在代码的同步部分抛出的。仅仅因为该方法返回一个 future 并不意味着该方法中的所有内容都是异步的。

void main() {
  try {
    divide(1, 0)
        .then((result) => print('1 / 0 = $result'));
  } catch (error) {
    print('Error occured during division: $error');
  }
}

如果你改变你的divide函数

Future<double> divide(int a, b) {
  return new Future(() {
    if (b == 0) {
      throw new Exception('Division by zero');
    }
    return new Future.value(a / b);
  });
}

您收到一个异步错误并且您的异步错误处理有效。

更简单的方法是使用新的 async/await

main() async {
  try {
    await divide(1, 0);
  } catch(error){
    print('Error occured during division: $error');
  }
}

试试DartPad

另一个优点是这在两种情况下都有效。

关于dart - future 的执行会导致未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29378453/

相关文章:

dart - 如何更改pubpackages文件夹的名称?

flutter - 如何在几秒钟后返回一个小部件?

c++ - 为什么在锁定 weak_ptr 时会出现访问冲突?

c++ - std::future.wait_for 永远阻塞

scala - 在 Scala 中将(任一 future 的列表)转换为(任一列表的 future )

node.js - 如何在 Node.js UnhandledPromiseRejectionWarning 中找到未处理的 promise ?

c# - .NET 中 UnhandledException 和 DispatcherUnhandledException 的区别

dart - Flutter Dart 构造函数

function - 测试 Dart 值是否实际上是一个函数?

flutter - Flutter:结合多个Future <T>任务