错误处理是网络请求过程中最重要的方面之一,同时他也是项目过程中很重要的一个东西。了解dartz包的Either
能以一种更清晰、更简洁的方式来管理成功和失败情况,让我们深入了解 dartz 里面Either。
Either
Either
就像一个值的容器,该值可能是错误或任何其他值。一般情况下,Left 是错误,Right 分别是值。
Either的使用
一般情况下我们针对网络请求的处理如下:
dart
// A function that uses traditional error handling
Future<http.Response> getData() async {
try {
final response = await http.post(Uri.parse('yourapilink'), body: {});
if (response.statusCode == 200) {
return response; // 成功
} else {
// 失败
switch (response.statusCode) {
case 400:
throw '服务器无法处理您的请求';
case 401:
throw '没有授权。。';
default:
throw '出现了一些其他的问题......';
}
}
} catch (e) {
//捕获意外错误
throw '发生意外错误:: $e';
}
}
尽管它提供了熟悉的结构化控制流,但传统的异常处理可能会带来性能开销,破坏自然代码流,导致冗长,并提供有限的信息,从而影响了一定程度的可读性和效率。
现在让我们使用Either
来处理上面的网络请求:
csharp
import 'package:dartz/dartz.dart';
// 使用 Either 概念处理错误的函数
Future<Either< String , http.Response>> getData() async {
try {
Final response = wait http.post( Uri .parse( 'yourapilink' ), body: {});
if (response.statusCode == 200 ) {
// 在这种情况下,请求成功
// 我们返回包含响应的 Right
return Right(response);
}
// 在这种情况下,请求不成功
// 我们可以检查状态代码
// 返回相应的消息
switch (response.statusCode) {
case 400 :
return const Left( '服务器无法处理您的请求' ) ;
case 401 :
return const Left( '没有授权' );
default:
return const Left( '出现了一些其他的问题...' );
}
} catch (e) {
return Left(e.toString());
}
}
用Either
可以有效地处理潜在的错误,并将该函数无缝集成到代码的各个部分中。这种方法可以提供更健壮和灵活的编程体验。
最后封装后的使用场景:
scss
Future requestData() async {
// 首先我们执行 getData() 函数并等待结果。
final value = await getData();
// 然后我们折叠结果以访问左值和右值
// 如果它是左值(错误),我们将处理错误
// 如果它是右值(实际数据),我们将相应地处理它。
value.fold(
(left) {
// 向用户显示错误消息
debugPrint(left);
},
(right) {
// 请求成功时返回的值
// 使用此数据更新 UI
debugPrint(right) );
},
);
}
通过采用这种方法,忽视错误处理的风险就会降低,从而使您的项目更加的清晰,以及易读,在dartz包中有很多简洁的功能和东西有待发现。