flutter - Dart - 无法从连接流中捕获异常
问题描述
我无法捕获connectivity.onConnectivityChanged.listen
函数内抛出的异常。我尝试过使用 try-catch 块和onError
函数,但我无法让它们工作。有人知道我做错了什么吗?
import 'package:flutter/foundation.dart';
import 'dart:async';
import 'package:connectivity/connectivity.dart';
import 'package:dio/dio.dart';
class DioConnectivityRequestRetrier {
final Dio dio;
final Connectivity connectivity;
DioConnectivityRequestRetrier({
@required this.dio,
@required this.connectivity,
});
Future<Response> scheduleRequestRetry(RequestOptions requestOptions) async {
StreamSubscription streamSubscription;
final responseCompleter = Completer<Response>();
try {
connectivity.onConnectivityChanged.listen(
(connectivityResult) {
if (connectivityResult != ConnectivityResult.none) {
// streamSubscription.cancel();
// An exception when dio.request fails
throw Exception;
responseCompleter.complete(
dio.request(
requestOptions.path,
cancelToken: requestOptions.cancelToken,
data: requestOptions.data,
onReceiveProgress: requestOptions.onReceiveProgress,
onSendProgress: requestOptions.onSendProgress,
queryParameters: requestOptions.queryParameters,
options: requestOptions,
),
);
}
},
).onError((e) {
throw e;
});
} catch (e) {
rethrow;
}
return responseCompleter.future;
}
}
抛出异常时调试控制台的输出connectivity.onConnectivityChanged.listen
:
E/flutter ( 8336): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Exception
E/flutter ( 8336): #0 DioConnectivityRequestRetrier.scheduleRequestRetry.<anonymous closure>
package:eindproduct/…/interceptor/dio_connectivity_request_retrier.dart:26
E/flutter ( 8336): #1 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 8336): #2 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 8336): #3 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 8336): #4 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter ( 8336): #5 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter ( 8336): #6 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/flutter ( 8336): #7 _MapStream._handleData (dart:async/stream_pipe.dart:224:10)
E/flutter ( 8336): #8 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter ( 8336): #9 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 8336): #10 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 8336): #11 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 8336): #12 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter ( 8336): #13 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter ( 8336): #14 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/flutter ( 8336): #15 _MapStream._handleData (dart:async/stream_pipe.dart:224:10)
E/flutter ( 8336): #16 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter ( 8336): #17 _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter ( 8336): #18 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 8336): #19 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 8336): #20 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter ( 8336): #21 _DelayedData.perform (dart:async/stream_impl.dart:611:14)
E/flutter ( 8336): #22 _StreamImplEvents.handleNext (dart:async/stream_impl.dart:730:11)
E/flutter ( 8336): #23 _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:687:7)
E/flutter ( 8336): #24 _rootRun (dart:async/zone.dart:1182:47)
E/flutter ( 8336): #25 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8336): #26 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 8336): #27 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 8336): #28 _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 8336): #29 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8336): #30 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 8336): #31 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 8336): #32 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 8336): #33 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
解决方案
尝试这样的事情:
try {
/// YOUR CODE HERE ///
} on PlatformException catch (e) {
print(e.toString());
}
推荐阅读
- ruby-on-rails - 在开发模式下使用自路由时在重定向时发送 404 状态码的任何方式
- delphi - Hook 不适用于第三个应用程序
- websphere - IBM BPM 保存更改和这些更改的可用性之间的异常时间间隔
- c++ - Win10无法从IDirectDraw7查询IDirect3D7
- javascript - 更改页面上的特定链接
- protocol-buffers - Protobuf (C++) 为可选字段抛出“缺少必需参数”错误
- python - 如何在有组织的集合中调用变量,以便在其他地方使用它?(Python)
- always-encrypted - .NET Core 3.1 始终加密
- python - Keras RNN 问题
- haskell - 如何在 [maybe string] 上使用 fmap,所以添加的字符串在 Just 之前?