当前位置: 首页 > 知识库问答 >
问题:

使用dart的异步与stack_trace的链

林修雅
2023-03-14

我试图利用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>
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不兼容吗?

共有1个答案

龚振
2023-03-14

您使用的是什么版本的Dart和stack_trace?在带有stack_trace1.2.3的Dart1.9.0-edge.44028上,删除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,这也将保留异步间隙。

 类似资料:
  • 异步操作在线程中执行,与主应用程序线程分开。当应用程序调用方法异步执行操作时,应用程序可以在异步方法执行其任务时继续执行。 示例 下面通过一个例子来理解这个概念。在示例程序中使用IO库接受用户输入。 是一种同步方法。它将阻止执行函数调用之后的所有指令,直到方法完成执行。 等待输入。它停止执行并且在收到用户输入之前不再执行任何操作。 以上示例将产生以下输出 - 在计算中,当某个事件在继续之前等待事件

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的

  • gRPC是否支持以下服务器和客户端之间的通信方案?1.客户端连接到服务器并调用waitMessages等方法。然后,客户端正在等待来自服务器的一些消息。2.服务器不时向客户端发送消息。例如,调用客户端的某个方法。3.客户端与服务器断开连接 我不喜欢通过轮询服务器来实现这个方案。我想调用服务器方法一次,然后等待消息。

  • 问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身

  • 问题内容: 我想从Redis + Hiredis + libevent中获得尽可能多的收益。 我正在使用以下代码(没有简短的说明) 要进行编译,请在系统中使用假定的libevent,redis和hiredis。 我好奇何时需要做?在每个回调中一次或(如示例所示)。我有什么办法可以提高性能? 我得到大约6000-7000 req / s。使用到这个基准,复杂化的东西当试图大的数字(如10K请求数)

  • 问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情