網站首頁 編程語言 正文
正文
你是否遇到過,出現異常的時候也需要給一個默認值,讓程序可以繼續運行下去?
一般的做法就是 一個達到try catch,然后在finally里面做一個處理。
今天我嘗試換一個思路,簡單的封裝一下
簡單封裝
首先定義一個stream轉換器,為了處理error handler。
如果onError不為空,就將出現錯誤添加到stream中
class StreamErrorHandle<T> extends StreamTransformerBase<T, T> {
final _controller = StreamController<T>.broadcast();
final T? Function(Object error) onError;
StreamErrorHandler({
required this.onError,
});
@override
Stream<T> bind(Stream<T> stream) {
...
}
}
override bind()
用Stream里面的handleError來捕獲錯誤。如果出現錯誤,我們調用handler,如果我們得到一個返回值,就將他發送到stream
@override
Stream<T> bind(Stream<T> stream) {
final sub = stream.handleError((error) {
final value = onError(error);
if (value != null) {
_controller.sink.add(value);
}
}).listen(_controller.sink.add);
_controller.onCancel = (){
sub.cancel();
};
return _controller.stream;
}
最后我們在Stream上面創建一個拓展,它允許我們輕松的使用我們的流轉換器
extension Recover<T> on Stream<T> {
Stream<T> onErrorRecoverWith(T? Functioon(Object error) onError) => transform(StreamErrorHandle<T>(onError: onError));
}
測試一下
Stream<String> getNames() async* {
yield 'Foo'.
yield 'Bar';
throw Exception('Something went wrong');
}
Future<void> testIt() async {
final names = getNames().onErrorRecoverWith(
(error) {
error.log();
return 'Baz';
},
);
await for(final name in names){
name.log(); // Foo, Bar, Baz
}
}
最后來看一下結果:
這里面有一個小注意的地方,log()是我自己封裝的一個拓展
import 'dart:developer' as devtools show log;
extension Log on Object {
void log() => devtools.log(toString());
}
原文鏈接:https://juejin.cn/post/7173543847287324680
相關推薦
- 2022-09-12 .Net6集成IdentityServer4?+AspNetCore?Identity讀取數據表用戶
- 2022-11-03 C#中委托、事件和回調的使用及說明_C#教程
- 2022-10-14 基于數據庫自定義UserDetailsService實現JWT認證
- 2022-03-22 .NET?6開發TodoList開發查詢分頁_實用技巧
- 2022-02-19 數據結構C語言鏈表的實現介紹_C 語言
- 2023-06-03 pip?install?python-Levenshtein失敗的解決_python
- 2022-03-14 文件上傳錯誤the request doesn't contain a multipart/form
- 2022-12-27 手把手教你實現一個C++單鏈表_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支