말랑한 하루

[Flutter] (Project) MapleApp: 25. 예외 처리 작업-4 본문

개발/Flutter

[Flutter] (Project) MapleApp: 25. 예외 처리 작업-4

지수는말랑이 2024. 1. 20. 19:51
반응형

🥕 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 구문을 통해 에러를 핸들링할 수 있게 됩니다.

반응형
Comments