期货/承诺,追踪错误

时间:2013-09-26 22:37:50

标签: dart promise future dart-async

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

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

面对这种情况时,最好采用哪些策略?

1 个答案:

答案 0 :(得分:6)

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

此示例打印“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