【问题标题】:Future execution leads to unhandled exception未来执行导致未处理的异常
【发布时间】:2015-03-31 20:58:39
【问题描述】:
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 中使用期货,我被困在一个简单的例子上。当用户尝试除以零时,我的未来会抛出异常。但是, .catchError 不处理我的异常。我用堆栈跟踪得到了未处理的异常。我很确定我遗漏了一些明显的东西,但不明白到底是什么。

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

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

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

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

德米特里

谢谢。

【问题讨论】:

    标签: dart future unhandled-exception


    【解决方案1】:

    您的错误处理不起作用,因为错误是在代码的同步部分引发的。仅仅因为该方法返回一个未来并不意味着该方法中的所有内容都是异步的。

    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

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

    【讨论】:

    • 感谢您的回答。我是否正确理解,await / async 是在 1.9 版本(最新版本)中引入的,它是期货的替代品?无论如何,我想了解我的示例有什么问题。
    • 我错过了一些事情并更新了我的答案。 async/await 不是代替期货,它只是让您更轻松地使用未来。见dartlang.org/articles/await-asyncstackoverflow.com/questions/27212220
    • 哦,对了!现在我知道了。还有一个简短的问题。如果我使用您示例中的修改除法函数,我可以只返回 a/b 而不是 new Future.value(a / b) 吗?也感谢您提供的链接。
    • 是的,在这种情况下new Future.value() 不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多