设计思路
- 用户登录:使用
try-catch
块捕获登录过程中的异常,并在catch
块中给用户显示相应的登录失败提示。同时,可以设置一个标志位记录登录状态。
- 获取购物车信息:同样使用
try-catch
,若获取失败,根据不同类型异常给用户显示对应的错误提示,比如网络问题、服务器错误等。
- 计算总价:因为此操作可能因商品价格数据异常等原因抛出异常,在
try-catch
中捕获异常,针对价格数据异常可以提示用户联系客服等操作。
- 整体流程:使用
Future
链式调用确保各个异步操作按顺序执行,在每个then
方法中进行下一步操作,在catchError
中统一处理全局错误,保证应用的稳定性和数据一致性。
关键代码片段
Future<void> processCart() async {
try {
// 用户登录
await login();
print('登录成功');
// 获取购物车信息
List<CartItem> cartItems = await getCartItems();
print('获取购物车信息成功');
// 计算总价
double totalPrice = await calculateTotalPrice(cartItems);
print('总价计算成功: $totalPrice');
// 显示总价给用户
showTotalPrice(totalPrice);
} catch (e) {
// 全局错误处理
if (e is LoginException) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('登录失败'),
content: Text('请检查用户名和密码'),
),
);
} else if (e is CartFetchException) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('获取购物车失败'),
content: Text('请检查网络连接或联系客服'),
),
);
} else if (e is PriceCalculationException) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('总价计算失败'),
content: Text('商品价格数据异常,请联系客服'),
),
);
} else {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('未知错误'),
content: Text('请稍后重试或联系客服'),
),
);
}
}
}
Future<void> login() async {
// 模拟登录异步操作
await Future.delayed(Duration(seconds: 2));
throw LoginException();
}
Future<List<CartItem>> getCartItems() async {
// 模拟获取购物车异步操作
await Future.delayed(Duration(seconds: 2));
throw CartFetchException();
}
Future<double> calculateTotalPrice(List<CartItem> cartItems) async {
// 模拟计算总价异步操作
await Future.delayed(Duration(seconds: 2));
throw PriceCalculationException();
}
void showTotalPrice(double totalPrice) {
// 显示总价给用户的逻辑
}
class LoginException implements Exception {}
class CartFetchException implements Exception {}
class PriceCalculationException implements Exception {}