@@ -24,11 +24,28 @@ AsyncError? _interceptError(Object error, StackTrace? stackTrace) {
2424 return replacement;
2525}
2626
27+ /// As [_interceptError] , but an `AsyncError` of the error if not replaced.
28+ ///
29+ /// Also like [_interceptUserError] , but for errors that are already
30+ /// asynchronous.
31+ AsyncError _interceptCaughtError (Object error, StackTrace ? stackTrace) =>
32+ _interceptError (error, stackTrace) ?? AsyncError (error, stackTrace);
33+ 2734/// Used for user-provided error and stack trace that are to become async
2835/// errors.
2936///
3037/// Allows `Zone.current.errorCallback` to intercept and modify the error,
3138/// and sets the stack trace on the error as if it was thrown.
39+ ///
40+ /// Used for errors given to async functions like [Completer.completeError]
41+ /// or [StreamController.addError] .
42+ ///
43+ /// For errors that are caught (and have therefore been thrown already)
44+ /// use [_interceptCaughtError] , which doesn't try to set a stack trace on the
45+ /// error object.
46+ ///
47+ /// Errors that are already asynchronous (coming out of streams or futures)
48+ /// should not call [Zone.errorCallback] .
3249AsyncError _interceptUserError (Object error, StackTrace ? stackTrace) {
3350 var zone = Zone .current;
3451 if (! identical (zone, _rootZone)) {
@@ -64,12 +81,11 @@ abstract class _Completer<T> implements Completer<T> {
6481 @pragma ("wasm:entry-point" )
6582 void completeError (Object error, [StackTrace ? stackTrace]) {
6683 if (! future._mayComplete) throw new StateError ("Future already completed" );
67- AsyncError (: error, : stackTrace) = _interceptUserError (error, stackTrace);
68- _completeError (error, stackTrace);
84+ _completeErrorObject (_interceptUserError (error, stackTrace));
6985 }
7086
7187 // Overridden by either a synchronous or asynchronous implementation.
72- void _completeError ( Object error, StackTrace stackTrace );
88+ void _completeErrorObject ( AsyncError error);
7389
7490 // The future's _isComplete doesn't take into account pending completions.
7591 // We therefore use _mayComplete.
@@ -85,8 +101,8 @@ class _AsyncCompleter<T> extends _Completer<T> {
85101 future._asyncComplete (value == null ? value as dynamic : value);
86102 }
87103
88- void _completeError ( Object error, StackTrace stackTrace ) {
89- future._asyncCompleteError (error, stackTrace );
104+ void _completeErrorObject ( AsyncError error) {
105+ future._asyncCompleteErrorObject (error);
90106 }
91107}
92108
@@ -100,8 +116,8 @@ class _SyncCompleter<T> extends _Completer<T> {
100116 future._complete (value == null ? value as dynamic : value);
101117 }
102118
103- void _completeError ( Object error, StackTrace stackTrace ) {
104- future._completeError (error, stackTrace );
119+ void _completeErrorObject ( AsyncError error) {
120+ future._completeErrorObject (error);
105121 }
106122}
107123
@@ -351,9 +367,8 @@ class _Future<T> implements Future<T> {
351367 _setValue (value);
352368 }
353369
354- _Future .immediateError (var error, StackTrace stackTrace)
355- : _zone = Zone ._current {
356- _asyncCompleteError (error, stackTrace);
370+ _Future .immediateError (AsyncError error) : _zone = Zone ._current {
371+ _asyncCompleteErrorObject (error);
357372 }
358373
359374 /// Creates a future that is already completed with the value.
@@ -497,10 +512,6 @@ class _Future<T> implements Future<T> {
497512 _resultOrListeners = error;
498513 }
499514
500- void _setError (Object error, StackTrace stackTrace) {
501- _setErrorObject (new AsyncError (error, stackTrace));
502- }
503- 504515 /// Copy the completion result of [source] into this future.
505516 ///
506517 /// Used when a chained future notices that its source is completed.
@@ -722,14 +733,18 @@ class _Future<T> implements Future<T> {
722733 _propagateToListeners (this , listeners);
723734 }
724735
725- void _completeError ( Object error, StackTrace stackTrace ) {
736+ void _completeErrorObject ( AsyncError error) {
726737 assert (! _isComplete);
727738
728739 _FutureListener ? listeners = _removeListeners ();
729- _setError (error, stackTrace );
740+ _setErrorObject (error);
730741 _propagateToListeners (this , listeners);
731742 }
732743
744+ void _completeError (Object error, StackTrace stackTrace) {
745+ _completeErrorObject (AsyncError (error, stackTrace));
746+ }
747+ 733748 // Completes future in a later microtask.
734749 void _asyncComplete (FutureOr <T > value) {
735750 assert (! _isComplete); // Allows both pending complete and incomplete.
@@ -809,11 +824,15 @@ class _Future<T> implements Future<T> {
809824 }
810825
811826 void _asyncCompleteError (Object error, StackTrace stackTrace) {
827+ _asyncCompleteErrorObject (AsyncError (error, stackTrace));
828+ }
829+ 830+ void _asyncCompleteErrorObject (AsyncError error) {
812831 assert (! _isComplete);
813832
814833 _setPendingComplete ();
815834 _zone.scheduleMicrotask (() {
816- _completeError (error, stackTrace );
835+ _completeErrorObject (error);
817836 });
818837 }
819838
@@ -919,7 +938,7 @@ class _Future<T> implements Future<T> {
919938 joinedResult._completeWithResultOf (originalSource);
920939 },
921940 onError: (Object e, StackTrace s) {
922- joinedResult._completeError ( e, s);
941+ joinedResult._completeErrorObject ( AsyncError ( e, s) );
923942 },
924943 );
925944 listenerValueOrError = joinedResult;
@@ -1020,9 +1039,11 @@ class _Future<T> implements Future<T> {
10201039 Timer timer;
10211040 if (onTimeout == null ) {
10221041 timer = new Timer (timeLimit, () {
1023- _future._completeError (
1024- new TimeoutException ("Future not completed" , timeLimit),
1025- StackTrace .current,
1042+ _future._completeErrorObject (
1043+ AsyncError (
1044+ new TimeoutException ("Future not completed" , timeLimit),
1045+ StackTrace .current,
1046+ ),
10261047 );
10271048 });
10281049 } else {
@@ -1035,7 +1056,7 @@ class _Future<T> implements Future<T> {
10351056 try {
10361057 _future._complete (zone.run (onTimeoutHandler));
10371058 } catch (e, s) {
1038- _future._completeError ( e, s);
1059+ _future._completeErrorObject ( AsyncError ( e, s) );
10391060 }
10401061 });
10411062 }
@@ -1049,7 +1070,7 @@ class _Future<T> implements Future<T> {
10491070 onError: (Object e, StackTrace s) {
10501071 if (timer.isActive) {
10511072 timer.cancel ();
1052- _future._completeError ( e, s);
1073+ _future._completeErrorObject ( AsyncError ( e, s) );
10531074 }
10541075 },
10551076 );
0 commit comments