Flutter&Dart Catch Block 没有捕获抛出的异常

Flutter&Dart Catch Block does not catch thrown Exception

我试图在服务器没有 return 200 状态代码时捕获抛出的异常。这是代码:

late Future<List<Data>> datasFuture;
String _warning = "";

@override
void initState() {
  try {
    datasFuture = RestfulServiceProvider.fetchDatas();
  } on Exception {
    _warning = "There is no data to fetch!";
  }
  super.initState();
}

//RestfulServiceProvider class
static Future<List<Data>> fetchDatas() async {
List jsonResponse = [];
final response =
    await http.get(Uri.parse('http://localhost:8080/datas'));

if (response.statusCode == 200) {
  jsonResponse = json.decode(response.body);
  return jsonResponse.map((data) => Data.fromJson(data)).toList();
} else {
  throw Exception();
}

}

当异常发生时代码没有进入异常块,我无法处理错误。任何想法或解决方案?谢谢。

Try-catch 块可以捕获在其块范围内发生的异常。您不会捕获错误,因为您只是将 Future 分配给一个变量(而不是等待它的值)。那么block能不能捕捉到单次赋值操作的异常呢?没有。变量刚刚被赋值,程序继续运行并立即退出 try-catch 块。您必须等待该值才能在块中捕获它 - 等待它。但是你不能直接在initState里面使用async-await语法。所以你有两个选择:

  1. catchError of Future

    RestfulServiceProvider.fetchDatas().catchError((error){Your code here})); 
  2. 用async-await

    将其用于另一个函数
     void someFunc () async{
              try {
         await RestfulServiceProvider.fetchDatas();
       } on Exception catch(e) {
         _warning = "There is no data to fetch!";
       }
    
    }
    

并在initState中调用