调用函数未捕获到另一个类发出的Flutter错误

时间:2019-09-10 14:43:02

标签: android flutter error-handling

我在flutter中有一个this bloc实现,因此一旦触发了bloc,它就会如下调用apiCall()函数

\1

这将调用存储库函数repository.getList(),如下所示。

Future apiCall() async {
    print("calling api now ");
    var future = repository.getList().catchError((err) {
      print("api_bloc:Error is " + err.toString());
      if(err is AuthError){
        print("Auth error");
      }      
    });
  }

在上面的代码中,它调用NetworkUtils.postNoToken(url)进行实际的发布并捕获并抛出错误。因此,应该将其包含在上面的函数中,但事实并非如此。下面是实际的帖子。

Future<CountyListRoot> getList() async {

      String url = "countyList";
       try{
      final countyListJson = await NetworkUtils.postNoToken(url).catchError((err) {
          print("county list repository is " + err.toString());
          if(err is AuthError){
            print("catch at repository Auth error");
            throw AuthError('Auth Error: ');
          }
      });
      print("countyListJson" + countyListJson.toString());
      return CountyListRoot.fromJson(countyListJson);
      }
      catch(exception){
        if(exception is AuthError){
          print("catch at repository Auth error");
        }
        print("Exception");
      }


  }

所以在上面的场景中,我特意创建了一个生成的场景

static dynamic postNoToken(String url) async {
        var uri = host + '/api/'+ url;

        try {

            final response = await http.post(
                uri,
        headers: {

            );

            final code = response.statusCode;
      print("Network util post reply code:"+code.toString());
      print("Network util post reply response body:"+response.body);
            if(code==401){

                throw AuthError('$code Auth Error: '+parseMessage(response.body));
            }
            else if(code>=500){

                throw UnknownError('$code. Server error: '+parseMessage(response.body));
            }
            else if(code>=400){

                throw Error4xx(' $code Wrong request : '+parseMessage(response.body));
            }


            return response.body;

        } catch (exception) {
            print(exception);

        }
    }

但是它没有在存储库功能中捕获或显示。 下面我也创建了模型。

if(code==401){

                throw AuthError('$code Auth Error: '+parseMessage(response.body));
            }

如何解决此错误的捕捉和传递,以便最终通过相应的小吃店或弹出窗口进行显示?

1 个答案:

答案 0 :(得分:1)

当您捕获异常时,您需要Equals("ALEXANDER", StringComparison.InvariantCultureIgnoreCase)以使其可以被调用方捕获。

https://dart.dev/guides/language/effective-dart/usage#do-use-rethrow-to-rethrow-a-caught-exception

因此,当前您在任何地方捕获到的异常都应rethrow(如果该特定捕获未处理该异常)。

rethrow