GOOGLE ADS

понедельник, 9 мая 2022 г.

Блок Flutter&Dart Catch не перехватывает выброшенное исключение

Я пытаюсь поймать выброшенное исключение, когда сервер не возвращает код состояния 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 варианта:


  1. catchError ofFuture

    RestfulServiceProvider.fetchDatas().catchError((ошибка){Ваш код здесь}));

  2. Использование его в другой функции с асинхронным ожиданием

    void someFunc () async{
    try {
    await RestfulServiceProvider.fetchDatas();
    } on Exception catch(e) {
    _warning = "There is no data to fetch!";
    }
    }


И вызовите его в initState

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...