Dart 如何捕获stream.listen的onData方法中抛出的错误

Dart 如何捕获stream.listen的onData方法中抛出的错误,dart,error-handling,stream,Dart,Error Handling,Stream,我正在用Dart构建一个事件驱动的应用程序 因此,我有一个中心流,所有的事件都放在那里 class EventManager { final StreamController<Event> _dataStreamController = StreamController<Event>.broadcast(); Stream get stream => _dataStreamController.stream; void addEvent(

我正在用Dart构建一个事件驱动的应用程序

因此,我有一个中心流,所有的事件都放在那里

class EventManager {
  final StreamController<Event> _dataStreamController =
      StreamController<Event>.broadcast();

  Stream get stream => _dataStreamController.stream;

  void addEvent(event) {
    _dataStreamController.sink.add(event);
  }
}
或者每个onData方法(handleMyEvent)都需要自己的try-catch块,如下所示:

 void handleMyEvent(event) {
    try{
      //handles MyEvent
      //might throw an Error
    } catch (generalError) {
      //handle Error
    }
 }

因为不可能在中心位置捕获它?

如果onData处理程序抛出,它将成为未捕获的异步错误。没有周围的上下文来捕捉错误,也没有地方转发错误

捕获这些错误的唯一方法是在运行
onData
处理程序的区域中引入未捕获的错误处理程序。 例如:

runZonedGuarded(){
stream.listen((事件){
可能投掷(事件);
});
},(东、南){
log(e,s);//或者其他什么。
});
如果改用
stream.forEach(onDataHandler)
,则抛出的处理程序将终止
forEach
,并在将来报告错误。
我建议始终使用
forEach
而不是
listen
,除非您需要访问
listen
返回的流订阅,因为我不想在第一个错误上停止,因为我不想在第一个错误上停止,对于你来说,你认为最好的做法是,在主程序中使用一个区域来绕我的整个异步的东西,或者每个监听的每个分区或者在每个OnData处理程序中尝试捕获。(在每个onData处理程序中的每个listen或try-catch周围都有一个区域似乎是相同的解决方案)我想这取决于您。我可能会使用
try
/
catch
在本地处理错误,并避免设置额外的区域。这更容易,也同样好。另一方面,如果您希望以相同的方式处理所有错误,则单个错误处理区域可能更容易。
 void handleMyEvent(event) {
    try{
      //handles MyEvent
      //might throw an Error
    } catch (generalError) {
      //handle Error
    }
 }