위 코드는 의도적으로 에러를 발생시키기 위해 작성된 예제입니다. 여기서 fetchWithError() 함수는 Future를 반환하며, 다음과 같은 동작을 합니다:
3초 동안 지연:
await Future.delayed(Duration(seconds: 3));
Future.delayed를 사용해 비동기 작업을 3초 동안 지연시킵니다.
에러 발생:
throw Exception('An error occurred');
throw Exception()을 통해 에러를 강제로 발생시킵니다.
이 코드는 FutureBuilder에서 에러가 발생했을 때, UI가 이를 어떻게 처리하는지 보여주기 위한 예제입니다. 실제 프로젝트에서는 네트워크 연결 문제, 데이터베이스 에러, 또는 API 응답 실패 등으로 인해 에러가 발생할 수 있습니다. 이런 상황에서 snapshot.hasError와 snapshot.error를 사용해 UI에서 적절히 대응할 수 있도록 만들어야 합니다.
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')); // 데이터가 없을 경우
}
},
);
이 예제는 테스트 환경에서 의도적으로 에러를 발생시켜 FutureBuilder가 에러를 어떻게 처리하는지 보여주기 위함입니다. 이런 식으로 비동기 작업에서 발생 가능한 다양한 상황을 미리 처리할 수 있도록 대비하는 것이 중요합니다.
Exception의 역할Exception은 Dart에서 예외 처리를 위해 제공되는 클래스입니다. 예외는 코드 실행 중에 발생할 수 있는 예상치 못한 상황(예: 네트워크 오류, 잘못된 입력 데이터 등)을 나타냅니다.
throw Exception('메시지')는 특정 상황에서 예외를 강제로 발생시켜 프로그램이 이 문제를 인식하고, 처리할 수 있도록 합니다. 이는 예외가 발생할 때 호출 스택을 거슬러 올라가며 적절한 핸들러에서 처리될 수 있도록 합니다.
Future<int> fetchData() async {
if (true) {
throw Exception('An error occurred'); // 에러 강제 발생
}
return 42;
}
위 코드는 조건이 참인 경우 예외를 발생시켜, Future가 정상적으로 완료되지 않음을 나타냅니다.
Exception을 생략하고 throw만 사용Exception을 꼭 사용하지 않아도, throw 키워드만으로 에러를 발생시킬 수 있습니다. Dart에서는 어떤 객체든 throw할 수 있습니다.
예:
throw 'An error occurred'; // 문자열을 직접 던질 수도 있음
이 경우에도 에러가 발생하며, Future는 실패 상태로 표시됩니다. 하지만 일반적으로 Exception 또는 Error와 같은 Dart 표준 클래스를 사용하는 것이 권장됩니다. 그 이유는:
try-catch로 처리할 때, 특정 유형의 예외만 처리 가능.만약 throw도 생략하고 단순히 에러 상황을 무시하면, 프로그램은 아무런 문제 없이 진행됩니다. 하지만 이는 심각한 문제를 발생시킬 수 있습니다:
Future에서 에러가 발생하면, 해당 Future는 실패 상태로 표시됩니다. FutureBuilder는 이를 감지하고, snapshot.hasError와 snapshot.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의 역할: 예상치 못한 상황에서 에러를 명시적으로 발생시키고 전달.throw 키워드만으로도 에러를 던질 수 있음.따라서, 의도적으로 에러를 던져야 할 때는 throw Exception('에러 메시지') 형태를 사용하는 것이 가장 좋은 방법입니다.