Flutter try catch

강정우·2023년 6월 6일
0

Flutter&Dart

목록 보기
51/87
post-thumbnail

No Data

  • 물론 이 부분도 back-end에 따라 다르다. 어쩌면 status code로 동작할 수 있고 또 어쩌면 그냥 빈 배열을 반환할 수 있다.
    하지만 여기 firebase에서는 String type의 null을 반환하므로 이때 isload state를 false로 바꾸고 밑에 다른 로직을 사용하지 않도록 return으로 해당 메서드를 종료시켜버리면 된다.

try-catch

  • try-catch 문에 대하여 다시 한 번 설명하자면 우선 back-end에서 넘어오는 다양한 이유들은 .statusCode로 다 에러처리를 하였다. 하지만 client의 문제로 인하여 어떠한 에러를 처리해야할 상황이라면 어떻게 할까?

throw Exception('');

  • 위 식은 vue.js에서 자주 사용하던 식이다. 백앤드의 결과값을 받아와서 로직이 처리가 안 된다면 New Error로 Error 객체를 생성한 다음 throw를 하여 사용자에게 직접 메시지를 보여주던 방식으로 진행하였다.

  • 하지만 flutter에서 try-catch는 이를 내부적으로 갖고있다. 즉, flutter와 dart가 client에 어떠한 이상이 있다면 스스로 Error를 생성하여 throw 한다는 것이다.
    이때 여기서는 Error가 아닌 Exception 객체를 사용한다는 차이점이 존재한다.

  • 하지만 위와같은 방법은 굉장히 위험하다 이를 잘 못 작성하면 app이 바로 충돌이 날 수 있기 때문이다.
    그것은 위 사진을 보면 알 수 있다. 한 번 Exception이 throw가 되면 밑에 코드는 실행되지 않는다.

http 모든 req는 throw Exception을 내장한다.

  • 그렇다면 앞서 언급했듯 한 번 잘못 되면 app이 crash가 되는데 이를 어떻게 해결할까? => try-catch문이다.
 void _loadItems() async {
    final url = Uri.https(
      'react-http-e4fe2-default-rtdb.asia-southeast1.firebasedatabase.app',
      'shopping-list.json',
    );
    try {
      final response = await http.get(url);
      // 값이 없을 때
      if (response.body == 'null') {
        setState(() {
          _isLoading = false;
        });
        return;
      }
		
      if (response.statusCode >= 400) {
        setState(() {
          _error = "Failed to fetch data. Plz try again later.";
        });
      }

      final Map<String, dynamic> listData = json.decode(response.body);
      final List<GroceryItem> loadedItems = [];
      for (final item in listData.entries) {
        final tempCategory = categories.entries
            .firstWhere((data) => data.value.title == item.value['category'])
            .value;
        loadedItems.add(GroceryItem(
            id: item.key,
            name: item.value['name'],
            quantity: item.value['quantity'],
            category: tempCategory));
      }
      setState(() {
        _groceryItems = loadedItems;
        _isLoading = false;
      });
    } catch (err) {
      setState(() {
        _error = err.toString();
      });
    }
  }
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글