'rethrow'는 현재의 예외를 다시 던지는 키워드입니다. 예외 처리 블록에서 예외를 잡아내지만, 그 예외를 다른 곳에서도 처리해야 할 경우에 사용됩니다.
// app_provider.dart
...
try {
if (searchTerm == 'fail') {
throw 'Something went wrong';
}
_state = AppState.success;
notifyListeners();
} catch (e) {
_state = AppState.error;
notifyListeners();
}
...
위의 예제에서 fail일때 throw 에러를 내보낸다고 가정해봅시다.
searchTerm가 fail일 때 throw에러를 발생시키지만 catch할 에러가 없기 때문에 다른곳에서 에러처리가 되어야 할 main.dart 파일의 코드는 에러를 catch하지 못하고 try구문의 Navigator.push를 실행시킵니다.
// main.dart
...
try {
await context.read<AppProvider>().getResult(searchTerm!);
Navigator.push(context, MaterialPageRoute(builder: (context) {
return SuccessPage();
}));
} catch (e) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(content: Text('Something went wrong'));
});
}
...
때문에 main.dart에서 에러를 catch 할 수 있도록 throw한 에러를 rethrow해서 main.dart에서 에러를 catch할 수 있도록 해줍니다.
// app_provider.dart 코드 수정
...
try {
if (searchTerm == 'fail') {
throw 'Something went wrong';
}
_state = AppState.success;
notifyListeners();
} catch (e) {
_state = AppState.error;
notifyListeners();
rethrow // 코드 수정
}
...