2

短い、単純なコード、Futures (dart)、または Promises (js) は、コールバックの恐ろしさに対する漠然とした有用な解決策を提供しているように見えます。

大規模なソフトウェアでは、たとえば、話しているサーバーがジャンクを返し始めたときに問題が発生し、サードパーティのコードの奥深くに埋め込まれた、これまで見られなかった例外がトリガーされます。この時点で、信じられないほど長い .then のチェーンのどこかで、catchError で終了し、新しい「Null ポインター例外」のようなものの幸運な受信者になります。それはどこから来たのか?知るか?明らかに、これらの手法を使用して呼び出しスタックを魔法のように取得するわけではなく、何の役にも立たないトレース情報はありません。特定の関数がこの巨大なチェーンで 50 回呼び出され、任意の呼び出しでエラーが発生する可能性があります。

このような状況に直面した場合、どのような戦略を採用するのが最適ですか?

4

1 に答える 1

6

ゾーンと呼ばれる今後の機能がここで役立ちます。また、チェックしてください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

于 2013-09-27T22:36:03.330 に答える