首页 > 解决方案 > 捕获侦听器中抛出的异常

问题描述

这是我在 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)

有谁知道如何捕获监听器中抛出的异常?这里的最佳做法是什么?

非常感谢

标签: dartstreamlistenerunhandled-exception

解决方案


stream.listen回调是独立的。如果您收到数据事件,则onData调用回调,如果您从流中收到错误,onError则调用该事件。(您的onData回调也被标记async为没有明显的原因,请检查是否有必要。)

如果你抛出任何一个回调,它就会变成一个未捕获的异步错误,并报告给当前Zone的未捕获错误处理程序。

回调中的错误onData不会转发给onError处理程序,这似乎是您的假设。

目前尚不完全清楚您想要哪种行为。你抛出的错误应该出现在哪里?它应该结束listen吗?(如果是这样,请记住订阅并取消它,除非您知道该流将在该事件之后自行关闭)。


推荐阅读