Исключение Flutter http не выбрасывается в другой блок try catch

#flutter #dart #exception #try-catch #flutter-http

#flutter #dart #исключение #try-catch #flutter-http

Вопрос:

Я попадаю в это странное исключение, которое продолжает приходить и замораживать мое приложение.
Я пытаюсь обработать исключения SocketException и TimeoutException в http-пакете с помощью пакета поставщика.

 class Auth with ChangeNotifier{
..........
Future<User> getUser(String id) async {
try {
final user = (await http.post("${Domain.ADDRESS}/user",
      headers: {"auth-token": _token}, body: {"userId": id}))
  .body;
 } on SocketException {
 throw HttpException("DISCONNECTED");
 } on TimeoutException {
 throw HttpException("TIMEOUT");
}  catch (error) {
 print(error);
  throw HttpException("SOMETHING_WENT_WRONG");
  }
 notifyListeners();
 return userdata;
 }
   ......
 }
  

когда интернет в не подключенном приложении зависает при

 on SocketException {
throw HttpException("DISCONNECTED");  <------------ Exception has occurred.
                                                  HttpException (DISCONNECTED)
  

Но я справляюсь с этим на следующем экране

  @override
  Future<void> didChangeDependencies() async {
 ......

 setState(() {
 isLoading = true;
 });
 try{
   user= await Provider.of<Auth>(context)
  .getUser(Provider.of<Auth>(context).userId);
 if (this.mounted) {
  setState(() {
    isLoading = false;
  });
    }
 
    }on HttpException catch(error){
    if(error.toString().contains("DISCONNECTED")){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Please check your internet 
 connection"),));
    }
   }catch(error){
     print(error);
   }
  super.didChangeDependencies();
}
  

Пользовательское исключение HttpException.dart

 class HttpException implements Exception {
final String message;
HttpException(this.message);
@override
String toString() {
return message;
}
}
  

Ответ №1:

Итак, если я вас правильно понимаю, ваша среда IDE приостанавливается при возникновении исключения, даже если вы его правильно перехватили.

Можете ли вы сказать мне, что происходит после возобновления / приостановки используемой IDE, ведет ли она себя так, как ожидалось, и печатает это?

 if(error.toString().contains("DISCONNECTED")){
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("Please check your internet 
 connection"),));
  

Потому что, если это так, это означает, что у вас, вероятно, установлены точки останова для всех исключений, а не только для неперехваченных исключений.

Изображение вкладки запуска визуального кода

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

1. Да, я понял. и еще одна вещь. Я могу перехватить исключение в следующем блоке catch, а не в следующем on HttpException catch(error){ } , мне не нужно писать эти строки.

2. Ах да, я вижу, кстати, можете ли вы отметить мой ответ как решение, чтобы я мог получить очки ^^

Ответ №2:

У меня также была эта проблема, и я узнал, что это было связано с ошибочной версией flutter beta / dev, которая у меня была.

Решение
Я исправил это, изменив канал на стабильный и обновив до последней версии.

 flutter channel stable
flutter upgrade
  

Если вы хотите, вы также можете изменить канал на master, чтобы использовать новейшие функции flutter. Но я бы действительно предложил использовать стабильный канал, поскольку он более стабилен и потому, что недавно была выпущена новая стабильная сборка.

Вот ссылка на проблему, с которой вы столкнулись:
https://github.com/flutter/flutter/issues/66488

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

1. Он не работает после выполнения этих инструкций, а также ссылки на эту проблему в устройстве ISO. но я использую Android. Есть ли какие-либо проблемы в коде?

2. Я написал новое предложение