MST

星途 面试题库

面试题:Flutter async/await 与复杂业务场景下的错误处理策略

在一个Flutter电商应用中,从用户登录(异步操作),到获取用户购物车信息(异步操作),再到根据购物车商品计算总价(可能因商品价格数据异常等原因抛出异常的异步操作),最后显示总价给用户。要求设计一个全面的错误处理机制,确保在任何一个异步操作失败时,能给用户合适的提示,同时保证应用的稳定性和数据一致性。请详细描述你的设计思路,并给出关键代码片段。
33.2万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 用户登录:使用try-catch块捕获登录过程中的异常,并在catch块中给用户显示相应的登录失败提示。同时,可以设置一个标志位记录登录状态。
  2. 获取购物车信息:同样使用try-catch,若获取失败,根据不同类型异常给用户显示对应的错误提示,比如网络问题、服务器错误等。
  3. 计算总价:因为此操作可能因商品价格数据异常等原因抛出异常,在try-catch中捕获异常,针对价格数据异常可以提示用户联系客服等操作。
  4. 整体流程:使用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 {}