【问题标题】:Using dart's async with stack_trace's Chain使用 dart 的 async 和 stack_trace 的 Chain
【发布时间】:2015-05-04 19:23:00
【问题描述】:

我正在尝试利用 stack_trace 提供的 Chain 对象,如下所示:

import 'dart:async';
import 'package:stack_trace/stack_trace.dart';

main() async {
  print('Hello world: ${console_test.calculate()}!');
  Chain.capture(() async {
    try {
      await testFunction();
    } catch(e,st) {
      print(Trace.format(new Chain.forTrace(st)));
    }
  });
}


Future testFunction() async {
  throw new Exception("TEST");
}

我得到的输出是这样的:

Hello world: 42!
main.dart 4:1  main.<async>.<fn>.<async>

我知道输出的堆栈跟踪应该包括 testFunction,但由于某种原因它不是。如果我用期货来代替:

import 'dart:async';
import 'package:stack_trace/stack_trace.dart';

main() async {
  print('Hello world: ${console_test.calculate()}!');
  Chain.capture(()  {
      return testFunction();
  }, onError: (e, stackTrace) => print(Trace.format(new Chain.forTrace(stackTrace))));
}

Future testFunction() async {
  throw new Exception("TEST");
}

我得到了更多预期的输出:

Hello world: 42!
main.dart 17:3       testFunction.<async>
dart:async           _Completer.completeError
main.dart 4:1        testFunction.<async>
dart:async           Future.Future
main.dart 4:1        testFunction
main.dart 11:26      main.<async>.<fn>
package:stack_trace  Chain.capture
main.dart 10:16      main.<async>

我做错了吗? Chain 是否与整个 async/await 不兼容?

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    您使用的是什么版本的 Dart 和 stack_trace?在 Dart 1.9.0-edge.44028stack_trace 1.2.3 上,删除 console_test 行后,我得到以下输出:

    test.dart 16:3       testFunction.<async>
    dart:async           _Completer.completeError
    test.dart 17:2       testFunction.<async>
    dart:async           Future.Future.microtask
    test.dart 7:25       main.<async>.<fn>.<async>
    package:stack_trace  Chain.capture
    test.dart 5:16       main.<async>
    

    还值得注意的是,您实际上并不需要将Trace.formatChain 一起使用。您可以只使用Chain.terse,这也将保留异步间隙。

    【讨论】:

    • 我在 1.8.5 稳定版,stack_trace 1.2.3。
    • 我正在使用 Trace.format 将其转换为字符串。 Chain.terse 不这样做。
    • 刚刚用 1.9.0 开发版本再次尝试,它工作正常。不过,我确实找到了解决方法,我将把它作为答案发布。
    【解决方案2】:

    @nex3 正确地指出我的原始示例实际上适用于 Dart 的 1.9.0 开发版本,因此目前这可能只是不兼容。无论如何,从 Chain.capture 中取出异步,将 testFunction() 上的 await 更改为 return 并在 Chain.Capture 上使用 await 实际上会产生正确的输出。这显然不是 100% 最佳的,但它可以完成工作。

    main() async {
      print('Hello world: ${console_test.calculate()}!');
      var test = await Chain.capture(() {
        return testFunction();
      },
      onError: (e, stackTrace) => print(Trace.format(new Chain.forTrace(stackTrace))));
      print(test);
    }
    
    Future testFunction() async {
      return "nice!";
      throw new Exception("TEST");
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2019-08-19
      • 2021-12-23
      • 2020-12-11
      • 2021-12-27
      • 2021-05-26
      • 2019-10-24
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多