dart - 捕获侦听器中抛出的异常
问题描述
这是我在 StackOverflow 上的第一篇文章!我希望它对许多开发人员有用!这是问题:
我正在使用侦听器来检查蓝牙设备状态。在那个监听器中,如果我在连接事件(用户拒绝配对)之后得到一个断开连接的事件 => 我抛出 RefusedAssociationException();
bool wasCo = false;
bluetoothDevice.state.listen((event) async {
if (event == BluetoothDeviceState.connected ||
event == BluetoothDeviceState.connecting) wasCo = true;
if (wasCo && event == BluetoothDeviceState.disconnected) {
print("We throw RefusedAssociationException");
wasCo = false;
throw RefusedAssociationException();
}
}).onError((handleError) => print("HANDLE ERROR IS : $handleError"));
await bluetoothDevice.connect();
此代码不允许我处理 RefusedAssociationException()。这是我得到的错误:
I/flutter (18595): We throw RefusedAssociationException
E/flutter (18595): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Instance of 'RefusedAssociationException'
E/flutter (18595): #0 BleLocalDataSourceImpl.connectToDevice.<anonymous closure> (package:tikee_remote_v2/features/tikee/data/datasources/local/ble_local_data_source.dart:107:9)
E/flutter (18595): #1 BleLocalDataSourceImpl.connectToDevice.<anonymous closure> (package:tikee_remote_v2/features/tikee/data/datasources/local/ble_local_data_source.dart:97:34)
E/flutter (18595): #2 _rootRunUnary (dart:async/zone.dart:1436:47)
E/flutter (18595): #3 _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter (18595): #4 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
E/flutter (18595): #5 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
E/flutter (18595): #6 _DelayedData.perform (dart:async/stream_impl.dart:591:14)
E/flutter (18595): #7 _StreamImplEvents.handleNext (dart:async/stream_impl.dart:706:11)
E/flutter (18595): #8 _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:663:7)
E/flutter (18595): #9 _rootRun (dart:async/zone.dart:1420:47)
E/flutter (18595): #10 _CustomZone.run (dart:async/zone.dart:1328:19)
E/flutter (18595): #11 _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
E/flutter (18595): #12 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1276:23)
E/flutter (18595): #13 _rootRun (dart:async/zone.dart:1428:13)
E/flutter (18595): #14 _CustomZone.run (dart:async/zone.dart:1328:19)
E/flutter (18595): #15 _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
E/flutter (18595): #16 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1276:23)
E/flutter (18595): #17 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter (18595): #18 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
有谁知道如何捕获监听器中抛出的异常?这里的最佳做法是什么?
非常感谢
解决方案
stream.listen
回调是独立的。如果您收到数据事件,则onData
调用回调,如果您从流中收到错误,onError
则调用该事件。(您的onData
回调也被标记async
为没有明显的原因,请检查是否有必要。)
如果你抛出任何一个回调,它就会变成一个未捕获的异步错误,并报告给当前Zone
的未捕获错误处理程序。
回调中的错误onData
不会转发给onError
处理程序,这似乎是您的假设。
目前尚不完全清楚您想要哪种行为。你抛出的错误应该出现在哪里?它应该结束listen
吗?(如果是这样,请记住订阅并取消它,除非您知道该流将在该事件之后自行关闭)。
推荐阅读
- javascript - 动态服务 - apache - 仅限 html、javascript 和 .htaccess
- javascript - 检查数组或单实例方法参数
- d3.js - 颠倒 d3.zoom 缩放和平移的顺序
- typescript - 为什么 TypeScript 抱怨数组长度?
- prometheus - Prometheus 实例标签与容器
- javascript - 为什么模型表单没有在锚标签上打开?
- javascript - Calculate corners of rotated rectangle in container
- python - 烧瓶邮件api,没有正确获取请求变量
- azure-virtual-machine - What doesn't the disk size in the portal match what I see in my VM File Explorer?
- powershell - 从发布管道运行 linqpad 脚本的最佳方式是什么?