본문 바로가기

안드로이드/Flutter

Flutter - Zone이란? 종료되지 않게 예외처리 하기

 

Flutter Zone이란? 종료되지 않게 예외처리 하기.

  • Zone이란?
  • try ~ catch와의 차이점
  • Zone 예제

 

플러터 플러그인을 쓰다보면

runZone()를 쓰는 경우가 종종 있습니다.

주로 아래처럼 쓰입니다.

 

flutter_crashlytics 플러그인

 

void main() async {
    await FlutterCrashlytics().initialize();
  ​
    runZoned<Future<Null>>(() async { 
      runApp(MyApp());
    }, onError: (error, stackTrace) async {
      await FlutterCrashlytics().reportCrash(error, stackTrace, forceCrash: false);
    });
  }

 

저도 처음에는 별 생각없이 적용했는데 점점 zone이 무엇인가 궁금해지더군요.

 

그래서 찾아봤습니다.

 

1. Zone이란?

zone은 프로그램이 예상치 못한 에러로부터 종료하는 걸 막을 때 쓰입니다. 일반적인 상황이면 프로그램이 종료되는 경우더라도 zone(존)을 쓰면 잘 돌아가게 되는 거죠.

 

1.1 try ~ catch를 사용한 경우

void main() {
  try {
    Timer.run(() {
      throw 'throw error'; // 명시적으로 throw를 사용. 일반적이면 무조건 에러 발생.
    });
  } catch(e) {
    print(e);
  }
}

 

에러가 생기고 프로그램이 중단됩니다.

하지만 Zone을 쓰면 계속 프로그램이 실행됩니다.

 

1.2 Zone을 사용한 경우

void main() {
​
  runZoned(() {
    Timer.run(() {
      throw 'do not kill the program'; // Zone을 썼기에 프로그램이 죽지 않습니다.
    });
​
  }, onError: (e) {
    print('Uncaught error ${e}');
  });
​
}

 

명시적으로 Throw을 날렸지만 프로그램이 멀쩡히 돌아갑니다!

 

Zone은 실행되는 공간을 나눠서, 그 공간 안에 있는 한 안전하게 프로그램이 돌아가도록 합니다.

 

크래시리틱스에서 runZone()을 쓴 건 정말 당연했네요. 크래시가 발생하더라도 이를 남기려면 프로그램이 종료되면 안되니까요.

 

Zone을 쓰는 예제를 몇개 더 적어보겠습니다.

 

2.1 Stream이랑 Zone 같이 써보기 - 1

void main() {
  var stream = File('data.text').openRead()
        .map((x) => throw 'Callback throws');
​
  stream.listen(print);
​
  runZoned(() {
     stream.listen(print);
​
  }, onError: (e) {
​
     print('Caught error: $e');
​
  });
}

 

2.2 Stream이랑 Zone 같이 써보기 - 2

void main() async {
  runZoned(() {
    countNumber();
  }, onError: print );
}
​
Future countNumber() async {
  await for ( var num in numbers()) {
    print('Num : $num');
​
    if (num > 10) throw ('error : $num'); // 에러 일부러 발생시킴
  }
}
​
Stream<int> numbers() async* {
  var duration = Duration(milliseconds: 30);
  for (var x = 0; x < 100; x++) {
    await Future.delayed(duration);
​
    yield x;
  }
}

 

숫자 11때 에러가 생기지만 프로그램이 강제적으로 종료되지 않습니다.

 

마무리

이번 글에선 Zone에 대해 알아보았습니다.

Zone을 쓰면 종료 되지 않아야 되는 상황을 다루기가 쉬워집니다.

무작정 runZone()에 넣는 건 안 좋은 습관이지만, Zone을 쓰면 예측하기 어려운 상황을 다룰 때 도움이 되겠네요.

 

참고글 : Zone에 관하여 (https://www.dartlang.org/articles/libraries/zones)

참고영상 : Tensor Programming채널의 Zone, Microtask ( https://www.youtube.com/watch?time_continue=1083&v=pHpvfaanrbw )

 

 

출처 : https://software-creator.tistory.com/19?category=681555