말랑한 하루
[Flutter] (Project) MapleApp: 25. 예외 처리 작업-4 본문
🥕 DioException 예외 처리
사용자의 닉네임이 정확히 입력되지 않은 경우, 서버에서 BadResponse, error 400 code를 보내왔다. 그래서 DioException의 error.type에 대한 모든 분기 처리를 진행했으나, 위 오류가 DioException으로 반환되는 것이 아닌 assureDioException을 타고 외부에서 에러를 throwing하고 있었다. 어떻게 해결해야 하나 엄청난 서칭 끝에 git issue에 등록된 글로 해결할 수 있었다.
가장 중요한 내용은, dio에서 전달받는 status code에서 성공하는 코드를 제외하고 나머지 에러는 인터셉터를 활용하여 DioException으로 보내버리는 행위를 해버리면 된다. dio의 상태에 대한 저장과, 인터셉터를 구현하고, Exception을 어떻게 관리하는지 까지 서술하겠다.
🍒 status 설정
dio의 유효성 검사는 status가 null이 아닐 때만 진행하도록 설정해줍니다.
dio = Dio();
dio.options.baseUrl = dotenv.get('NEXON_API_URL');
dio.options.validateStatus = (status) => status != null;
🍒 interceptor 설정
dio의 interceptor를 상속 받는 class를 생성하고, Response에 대한 설정을 재 정의합니다. statusCode가 성공적인 20x코드가 아닌 모든 경우에 모든 에러 사항을 DioException의 badResponse로 재 구축하여 전달하도록 합니다. 이후 dio option의 interceptor에 customInterceptor를 할당해주면 끝입니다.
import 'package:dio/dio.dart';
class DioErrorInterceptor extends Interceptor {
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
final status = response.statusCode;
final isValid = status != null && status >= 200 && status < 300;
if (!isValid) {
throw DioException.badResponse(
statusCode: status!,
requestOptions: response.requestOptions,
response: response,
);
}
super.onResponse(response, handler);
}
}
이러면 서버에서 DioException을 반환하지 않고, 그 외 오류로 벗어난다 해도 인터셉터가 모든 오류를 다시 DioException의 badResponse 개체로 만들어 throwing 하므로 우리는 try/catch 구문을 통해 에러를 핸들링할 수 있게 됩니다.
'개발 > Flutter' 카테고리의 다른 글
[Flutter] (Project) MapleApp: 27. 예외 처리 작업-6 (0) | 2024.01.22 |
---|---|
[Flutter] (Project) MapleApp: 26. 예외 처리 작업-5 (0) | 2024.01.21 |
[Flutter] (Project) MapleApp: 24. 예외 처리 작업-3 (0) | 2024.01.19 |
[Flutter] (Project) MapleApp: 23. 예외 처리 작업-2 (0) | 2024.01.18 |
[Flutter] (Project) MapleApp: 22. 예외 처리 작업-1 (0) | 2024.01.17 |