Flutter Zone이란? 종료되지 않게 예외처리 하기.
- Zone이란?
- try ~ catch와의 차이점
- Zone 예제
플러터 플러그인을 쓰다보면
runZone()를 쓰는 경우가 종종 있습니다.
주로 아래처럼 쓰입니다.
flutter_crashlytics 플러그인
xvoid 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를 사용한 경우
xxxxxxxxxxvoid main() { try { Timer.run(() { throw 'throw error'; // 명시적으로 throw를 사용. 일반적이면 무조건 에러 발생. }); } catch(e) { print(e); }}
에러가 생기고 프로그램이 중단됩니다.
하지만 Zone을 쓰면 계속 프로그램이 실행됩니다.
1.2 Zone을 사용한 경우
xxxxxxxxxxvoid 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
xxxxxxxxxxvoid 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
xxxxxxxxxxvoid 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 )
'플러터(Flutter)' 카테고리의 다른 글
| Flutter - CustomPainter로 차트(그래프) 그려보기 (7) | 2019.05.17 |
|---|---|
| Flutter - 유닛 테스트 해보기 (1) | 2019.04.22 |
| Flutter - 플러터에서 리액티브 프로그래밍, Stream과 Bloc 패턴 적용하기 (11) | 2018.11.16 |
| 플러터를 빠르게 배우기 좋은 4개의 사이트 (12) | 2018.11.07 |
| Flutter Layout - 첫 플러터 앱 만들어보기 (11) | 2018.11.04 |