Dart 如何捕获stream.listen的onData方法中抛出的错误
我正在用Dart构建一个事件驱动的应用程序 因此,我有一个中心流,所有的事件都放在那里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(
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
}
}