【问题标题】:Flutter can't catch exception after throw exception抛出异常后 Flutter 无法捕获异常
【发布时间】:2021-09-02 21:36:06
【问题描述】:

我有 func ,在调用函数之后,我想抛出一个 ApiException,但我没有抓住它。

第 1 步:

我没有在这里捕获 ApiException

FutureOr<void> login({String? user, String? password}) async {
    try {
      emit(LoadingLoginState());
      await loginUseCase?.login(user, password);
    } on ApiException catch (e) {  // I'nt catch ApiException here
      emit(ErrorLoginState(errorMessage: e.errorMessage));
    } catch (_) {
      emit(ErrorLoginState(errorMessage: S.current.connectionProblem));
    }
  }

第 2 步:

class LoginUseCase {
  final LoginRepository _loginRepository;

  LoginUseCase(this._loginRepository);

  Future<LoginResponse?>? login(String? user, String? password) =>
      _loginRepository.login(user, password);
}

第 3 步:

abstract class LoginRepository{
  Future<LoginResponse?>? login(String? user, String? password);
}

第 4 步:

抛出 ApiException()

class UserRepoImpl implements LoginRepository {
  UserApi? userApi;

  UserRepoImpl({this.userApi});

  @override
  Future<LoginResponse?>? login(String? user, String? password) async {
     throw ApiException();
  }
}

【问题讨论】:

    标签: flutter dart flutter-test


    【解决方案1】:

    要异步捕获错误,您可以使用.catchError

    callApi().catchError((error){
      // handle exception here
    }); 
    

    更新:你的代码

    FutureOr<void> login({String? user, String? password}) async {
        emit(LoadingLoginState());
        await loginUseCase?.login(user, password)
            ?.catchError(error) {
          if(error is ApiException) {
            emit(ErrorLoginState(errorMessage: e.errorMessage));
          } else {
            emit(ErrorLoginState(errorMessage: S.current.connectionProblem));
          }
        }
      }
    

    【讨论】:

    • 你能详细说明为什么你不能调用catchError吗?我会打电话更新答案
    • 更新了可以工作的代码。请注意,我在没有 IDE 的情况下编写了这个,对于任何 lints 和拼写错误表示抱歉
    • 我不知道,但它从不调用 catchError。
    【解决方案2】:

    尝试用这样的 try-catch 块包装具体实现:

    class LoginUseCase {
      final LoginRepository _loginRepository;
    
      LoginUseCase(this._loginRepository);
    
      Future<LoginResponse?>? login(String? user, String? password) {
          
          try{
    
             _loginRepository.login(user, password);
    
          } on ApiException catch(e){
    
             print('API Exception caught');
    
          }
      } 
    }
    
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2011-04-05
      • 2015-09-23
      • 2013-08-02
      • 2018-05-30
      • 2016-02-17
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多