【问题标题】:Async/future error handling in Dart not working as expectedDart 中的异步/未来错误处理未按预期工作
【发布时间】:2016-02-19 09:45:19
【问题描述】:

我已经花了几个小时研究 Dart 页面上的 Futures and Error Handling 部分,但没有任何运气。谁能解释一下为什么下面的代码不打印All good

import 'dart:async';

main() async {
  try {
    await func1();
  } catch (e) {
    print('All good');
  }
}

Future func1() {
  var completer = new Completer();
  func2().catchError(() => completer.completeError('Noo'));
  return completer.future;
}

Future func2() {
  var completer = new Completer();
  completer.completeError('Noo');
  return completer.future;
}

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    func1 中,用作catchError 参数的函数必须是(dynamic) => dynamic 类型的子类型,关于错误:

    未处理的异常:

    type '() => dynamic' 不是 'f' 的 type '(dynamic) => dynamic' 的子类型。

    因此你应该使用:

    Future func1() {
      var completer = new Completer();
      func2().catchError((e) => completer.completeError('Noo'));
      return completer.future;
    }
    

    您不会收到任何分析器错误,因为参数是用Function 键入的。你可以file an issue知道为什么类型不是更具体的类型匹配(dynamic)=>dynamic

    【讨论】:

    • 谢谢。这是有道理的。我认为代码很好,因为我没有收到分析器警告。此外,我对 DartPad 将所有错误和异常显示为 Script error 这一事实感到困惑,所以我认为代码失败是因为 func2() 中的 completeError 调用,但它与此无关。
    • catchError 参数的函数类型并不具体,因为该函数同时接受(dynamic)->dynamic(dynamic, StackTrace)->dynamic。接受两者的最精确类型是Function
    • 感谢您的信息。还有一个联合类型可以提供帮助的地方。
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2018-05-29
    • 2019-04-19
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多