Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dart';与堆栈#跟踪';s链_Dart_Dart Async - Fatal编程技术网

使用dart';与堆栈#跟踪';s链

使用dart';与堆栈#跟踪';s链,dart,dart-async,Dart,Dart Async,我试图利用stack_trace提供的Chain对象,如下所示: 导入'dart:async'; 导入“package:stack_trace/stack_trace.dart”; main()异步{ 打印('helloworld:${console_test.calculate()}!'); Chain.capture(()异步{ 试一试{ 等待testFunction(); }渔获物(东、西){ 打印(Trace.format(新的Chain.forTrace(st)); } }); } F

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

导入'dart:async';
导入“package:stack_trace/stack_trace.dart”;
main()异步{
打印('helloworld:${console_test.calculate()}!');
Chain.capture(()异步{
试一试{
等待testFunction();
}渔获物(东、西){
打印(Trace.format(新的Chain.forTrace(st));
}
});
}
Future testFunction()异步{
抛出新异常(“测试”);
}
我得到的输出是:

你好,世界:42!
主。省道4:1主。。。
我知道输出的堆栈跟踪应该包括testFunction,但由于某些原因它不是。如果我用期货来代替:

导入'dart:async';
导入“package:stack_trace/stack_trace.dart”;
main()异步{
打印('helloworld:${console_test.calculate()}!');
链捕获(){
返回testFunction();
},onError:(e,stackTrace)=>print(Trace.format(newchain.forTrace(stackTrace));
}
Future testFunction()异步{
抛出新异常(“测试”);
}
我得到了更多的预期输出:

你好,世界:42!
main.dart 17:3测试函数。
dart:async\u Completer.completeError
main.dart 4:1测试函数。
异步未来。未来
main.dart 4:1测试函数
主干道11:26主干道。。
包:stack_trace Chain.capture
主干道10:16主干道。

我做错什么了吗?链与整个async/Wait东西不兼容吗?

您使用的Dart和
堆栈跟踪的版本是什么?在带有堆栈跟踪的Dart
1.9.0-edge.44028
上,删除
控制台测试行后,我得到以下输出:

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>
test.dart 16:3 testFunction。
dart:async\u Completer.completeError
test.dart 17:2 testFunction。
dart:async Future.Future.microtask
测试。飞镖7:25主。。。
包:stack_trace Chain.capture
测试。飞镖5:16主。

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

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

main()异步{
打印('helloworld:${console_test.calculate()}!');
var测试=等待链。捕获(){
返回testFunction();
},
onError:(e,stackTrace)=>print(Trace.format(newchain.forTrace(stackTrace)));
打印(测试);
}
Future testFunction()异步{
回答“很好!”;
抛出新异常(“测试”);
}

我使用的是1.8.5稳定版本的stack\u trace 1.2.3。我使用trace.format将其转换为字符串。terse并没有做到这一点,只是在1.9.0开发版本中再次尝试,它工作正常。我确实找到了一个解决办法,我将把它作为一个答案发布。