Я пытаюсь поймать выброшенное исключение, когда сервер не возвращает код состояния 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
значение переменной (не ожидая ее значения). Так может ли блок перехватывать исключения из одиночной операции присваивания? Нет. Переменная только что присваивается, и программа продолжает работу и немедленно выходит из блока try-catch. Вы должны ждать значения, чтобы поймать его в блоке - ожидая его. Но вы не можете использовать синтаксис async-await непосредственно внутри initState
. Итак, у вас есть 2 варианта:
catchError of
RestfulServiceProvider.fetchDatas().catchError((ошибка){Ваш код здесь}));Future
Использование его в другой функции с асинхронным ожиданием
void someFunc () async{
try {
await RestfulServiceProvider.fetchDatas();
} on Exception catch(e) {
_warning = "There is no data to fetch!";
}
}
И вызовите его в initState
Комментариев нет:
Отправить комментарий