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语法。所以你有两个选择:
catchError of Future
RestfulServiceProvider.fetchDatas().catchError((error){Your code here}));
用async-await
将其用于另一个函数
void someFunc () async{
try {
await RestfulServiceProvider.fetchDatas();
} on Exception catch(e) {
_warning = "There is no data to fetch!";
}
}
并在initState中调用
我试图在服务器没有 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语法。所以你有两个选择:
catchError of
Future
RestfulServiceProvider.fetchDatas().catchError((error){Your code here}));
用async-await
将其用于另一个函数void someFunc () async{ try { await RestfulServiceProvider.fetchDatas(); } on Exception catch(e) { _warning = "There is no data to fetch!"; } }
并在initState中调用