gpt4 book ai didi

dart - Futures/Promises,并追踪错误

转载 作者:行者123 更新时间:2023-12-01 08:15:08 25 4
gpt4 key购买 nike

简而言之,简单的代码片段,Futures (dart) 或 Promises (js),似乎为回调的恐怖提供了一个模糊有用的解决方案。

对于大型软件,当您正在与之交谈的服务器开始返回垃圾邮件时,就会出现问题,从而触发深埋在第三方代码中的迄今未见的异常。此时,在一个令人难以置信的长链中的某处,以 catchError 终止的 .then 链中的某个地方,您将成为新的“空指针异常”之类的幸运接收者。它从哪里来的?谁知道?显然,我们不会使用这些技术神奇地获得调用堆栈,并且没有任何有用的跟踪信息 - 某些特定函数可能在这个巨大的链中被调用 50 次,并且在某些任意调用时,会引发错误。

面对这种情况,最好采用什么策略?

最佳答案

即将推出的名为 Zones 的功能应该在这方面有所帮助。另外,请查看 getAttachedStackTrace

这个例子打印“inside of catchError”:

import 'dart:async';

void main() {
runZonedExperimental(() {
new Future.value(1)
.then((v) => v)
.then((v) => throw new ArgumentError('testing'))
.then((v) => v)
.catchError((e) => print('inside of catchError'));
},
onError: print);
}

此示例打印“in onError”:

import 'dart:async';

void main() {
runZonedExperimental(() {
new Future.value(1)
.then((v) => v)
.then((v) => throw new ArgumentError('testing'))
.then((v) => v);
},
onError: (e) => print('in onError'));
}

这个例子打印了“in onError: Illegal argument(s): testing”:

import 'dart:async';

void main() {
runZonedExperimental(() {
new Future.value(1)
.then((v) => v)
.then((v) => throw new ArgumentError('testing'))
.then((v) => v);
},
onError: (e) => print('in onError: $e'));
}

此示例打印出堆栈跟踪,其中包含原始异常发生的文件和行号:

#0      main.<anonymous closure>.<anonymous closure> (file:///Users/sethladd/dart/zoneexperiment/bin/zoneexperiment.dart:7:20)

代码:

import 'dart:async';

void main() {
runZonedExperimental(() {
new Future.value(1)
.then((v) => v)
.then((v) => throw new ArgumentError('testing'))
.then((v) => v);
},
onError: (e) => print(getAttachedStackTrace(e)));
}

区域应该在 1.0 之前退出实验。

getAttachedStackTrace 的文档:http://api.dartlang.org/docs/releases/latest/dart_async.html#getAttachedStackTrace

runZoned 的文档:http://api.dartlang.org/docs/releases/latest/dart_async.html#runZonedExperimental

关于dart - Futures/Promises,并追踪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19039865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com