future builder 에러만들기

pharmDev·2024년 12월 9일

위 코드는 의도적으로 에러를 발생시키기 위해 작성된 예제입니다. 여기서 fetchWithError() 함수는 Future를 반환하며, 다음과 같은 동작을 합니다:

  1. 3초 동안 지연:

    await Future.delayed(Duration(seconds: 3));

    Future.delayed를 사용해 비동기 작업을 3초 동안 지연시킵니다.

  2. 에러 발생:

    throw Exception('An error occurred');

    throw Exception()을 통해 에러를 강제로 발생시킵니다.

의도

이 코드는 FutureBuilder에서 에러가 발생했을 때, UI가 이를 어떻게 처리하는지 보여주기 위한 예제입니다. 실제 프로젝트에서는 네트워크 연결 문제, 데이터베이스 에러, 또는 API 응답 실패 등으로 인해 에러가 발생할 수 있습니다. 이런 상황에서 snapshot.hasErrorsnapshot.error를 사용해 UI에서 적절히 대응할 수 있도록 만들어야 합니다.

FutureBuilder에서 에러 처리 예제

FutureBuilder<int>(
  future: fetchWithError(), // 에러를 발생시키는 Future
  builder: (context, AsyncSnapshot<int> snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return Center(child: CircularProgressIndicator()); // 로딩 중
    } else if (snapshot.hasError) {
      return Center(
        child: Text('Error: ${snapshot.error}'), // 에러 메시지 표시
      );
    } else if (snapshot.hasData) {
      return Center(
        child: Text('Number: ${snapshot.data}'), // 성공적으로 받은 데이터 표시
      );
    } else {
      return Center(child: Text('No Data')); // 데이터가 없을 경우
    }
  },
);

실제 시나리오

  • 네트워크 에러: API 서버가 다운되었거나 인터넷 연결이 끊어진 경우.
  • 데이터 처리 에러: 잘못된 JSON 구조로 인해 디코딩 실패.
  • 기타: 알 수 없는 이유로 Future가 실패.

이 예제는 테스트 환경에서 의도적으로 에러를 발생시켜 FutureBuilder가 에러를 어떻게 처리하는지 보여주기 위함입니다. 이런 식으로 비동기 작업에서 발생 가능한 다양한 상황을 미리 처리할 수 있도록 대비하는 것이 중요합니다.

Exception의 역할

Exception은 Dart에서 예외 처리를 위해 제공되는 클래스입니다. 예외는 코드 실행 중에 발생할 수 있는 예상치 못한 상황(예: 네트워크 오류, 잘못된 입력 데이터 등)을 나타냅니다.

throw Exception('메시지')는 특정 상황에서 예외를 강제로 발생시켜 프로그램이 이 문제를 인식하고, 처리할 수 있도록 합니다. 이는 예외가 발생할 때 호출 스택을 거슬러 올라가며 적절한 핸들러에서 처리될 수 있도록 합니다.

예외 발생 예제

Future<int> fetchData() async {
  if (true) {
    throw Exception('An error occurred'); // 에러 강제 발생
  }
  return 42;
}

위 코드는 조건이 참인 경우 예외를 발생시켜, Future가 정상적으로 완료되지 않음을 나타냅니다.


Exception을 생략하면 어떻게 될까?

1. Exception을 생략하고 throw만 사용

Exception을 꼭 사용하지 않아도, throw 키워드만으로 에러를 발생시킬 수 있습니다. Dart에서는 어떤 객체든 throw할 수 있습니다.

예:

throw 'An error occurred'; // 문자열을 직접 던질 수도 있음

이 경우에도 에러가 발생하며, Future는 실패 상태로 표시됩니다. 하지만 일반적으로 Exception 또는 Error와 같은 Dart 표준 클래스를 사용하는 것이 권장됩니다. 그 이유는:

  • 명확성: 에러의 의미를 명확히 전달.
  • 핸들링 편의성: try-catch로 처리할 때, 특정 유형의 예외만 처리 가능.
  • 표준화: Dart의 코드 스타일 가이드에 부합.

예외 처리 없는 경우

만약 throw도 생략하고 단순히 에러 상황을 무시하면, 프로그램은 아무런 문제 없이 진행됩니다. 하지만 이는 심각한 문제를 발생시킬 수 있습니다:

  • 예상치 못한 동작.
  • 디버깅 어려움.

Future에서 에러 발생과 처리

Future에서 에러가 발생하면, 해당 Future는 실패 상태로 표시됩니다. FutureBuilder는 이를 감지하고, snapshot.hasErrorsnapshot.error를 통해 에러를 확인할 수 있습니다.

throw Exception 사용 예:

Future<int> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  throw Exception('An intentional error'); // 명확한 에러 메시지
}

throw만 사용하는 경우:

Future<int> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  throw 'Error without Exception'; // 문자열을 던짐
}

둘 다 Future는 실패로 표시되며, FutureBuilder에서 동일하게 처리됩니다.


결론

  • Exception의 역할: 예상치 못한 상황에서 에러를 명시적으로 발생시키고 전달.
  • Exception을 생략해도 에러는 발생: throw 키워드만으로도 에러를 던질 수 있음.
  • Exception을 사용하는 것이 권장:
    • 코드를 더 명확하게 표현.
    • 에러 핸들링 및 디버깅에 유리.
    • Dart 표준화된 예외 처리 방식을 따름.

따라서, 의도적으로 에러를 던져야 할 때는 throw Exception('에러 메시지') 형태를 사용하는 것이 가장 좋은 방법입니다.

profile
코딩을 배우는 초보

0개의 댓글