Flutter 앱이 충돌했을 때 오류 내용을 Slack에 게시하는 메커니즘 구현

이 기사는 Flutter #1 Advent Calendar 2020 의 9일째의 기사...의 예정으로 쓰고 있었습니다만, 공개가 시간에 맞지 않고 다른 분이 9일째의 기사를 써 주셨으므로 Advent Calendar는 관계 사라졌습니다 😇

내가 개발하는 Android 앱은 개발 버전 앱에서 충돌이 발생했을 때 오류 내용과 터미널 정보를 특정 Slack 채널에 게시하는 메커니즘을 자주 만듭니다.
Android 앱이라면, Thread.setDefaultUncaughtExceptionHandler그 근처에 대한 자세한 내용은 "Android 앱 개발에서 예외가 발생한 위치 확인"기사 등을 읽으면 좋을까 생각합니다.

이번에는 이와 비슷한 것을 Flutter 앱으로 구현하는 방법을 소개합니다.
샘플 코드를 GitHub에서 공개하고 있으므로, 맞춰주세요.
htps : // 기주 b. 코 m / 오페란도 / 센 d_ 후 1 r_ 에로 r_

원래 왜 충돌을 처리하고 오류 내용을 Slack에 게시하는지



개발판 앱은 사내의 여러 멤버가 매일 만지므로, 누군가의 손에 일어난 크래시의 에러 내용을 놓치지 않는 구조가 필요하다고 생각합니다.
Slack에 게시하면 내가 나름대로 알 수 있기 때문에 그런 느낌의 메커니즘을 앱에 구현하고 운영하고 있습니다.

Flutter의 오류 처리 이해



이하 2개의 공식 문서가 참고가 되었습니다.

  • Handling errors in Flutter

  • Report errors to a service

  • 크래시가 일어났을 때, 그것을 핸들링해 임의의 처리를 실행할 수 있을 것 같은 것을 알았습니다.

    오류 처리하여 오류 내용을 Slack에 게시



    다음과 같이 main 함수로 에러 핸들링을 구현하고 크래시가 발생했을 때 그것을 핸들링하여 에러 내용을 Slack에 게시합니다.
    void main() {
      runZonedGuarded<Future<void>>(() async {
        WidgetsFlutterBinding.ensureInitialized();
        FlutterError.onError = (FlutterErrorDetails details) async {
          FlutterError.dumpErrorToConsole(details);
          if (kDebugMode) {
            await sendError(details.exceptionAsString());
          }
          exit(1);
        };
        runApp(MyApp());
      }, (dynamic error, StackTrace stackTrace) async {
        if (kDebugMode) {
          await sendError(error.toString());
        }
        exit(1);
      });
    }
    
    Future<void> sendError(String text) async {
      final response = await http.post('https://slack.com/api/chat.postMessage?channel=XXXXX&text=$text',
          headers: { "Authorization": "Bearer XXXXXX" });
      print('Response status: ${response.statusCode}');
      print('Response body: ${response.body}');
    }
    
    kDebugMode를 사용하여 앱이 디버그 모드에서 실행 중일 때만 오류 내용을 Slack에 게시합니다.
    이번의 구현에서는 보내고 있는 에러 내용은 간소한 것입니다만, 구현에 따라서는 단말 정보 등 보다 상세한 내용을 포함할 수도 있다고 생각합니다.

    덧붙여서, 에러 핸들링의 구현 자체를 알면, Slack 이외의 서비스에에 투고하거나 등, 여러가지 할 수 있다고 생각합니다.
    예를 들어, GitHub에 에러 내용의 issue를 만들 수도 있다고 생각합니다.

    실제로 움직여보세요



    앱에 오류 처리를 구현하고 버튼을 누르면 충돌이 발생하도록 실제로 움직입니다.
    아래와 같이 앱이 충돌하면 오류 내용이 Slack에 게시됩니다.



    덤 : Catcher



    이번에 소개한 듯한 에러 핸들링을 하고, 에러 내용을 뭔가 여러가지 Catcher 라는 라이브러리를 발견했습니다.
    이 라이브러리를 사용하면 스스로 에러 핸들링하는 구현을 생략할 수 있습니다.
    또, 핸들링한 에러 내용을 다양한 방법으로 리포팅하는 구조가 라이브러리로 준비되어 있습니다.
    예를 들어, Slack Handler 가 있거나 하므로, 이것을 사용하면 Slack에 투고하는 구현은 라이브러리에 맡길 수 있으므로, 구현이 매우 편해집니다.

    좋은 웹페이지 즐겨찾기