未来的执行会导致未处理的异常

时间:2015-03-31 20:58:40

标签: 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中使用期货,我被这样一个简单的例子所困扰。当用户尝试执行除零时,我的未来会抛出异常。但是,.catchError不能处理我的异常。我用堆栈跟踪代替了未处理的异常。我很确定我错过了一些显而易见但却无法理解的内容。

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

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

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

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

梅德

谢谢。

1 个答案:

答案 0 :(得分:4)

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

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

另一个优点是这两种情况都适用。

相关问题