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를 사용한 경우
xxxxxxxxxx
void main() {
try {
Timer.run(() {
throw 'throw error'; // 명시적으로 throw를 사용. 일반적이면 무조건 에러 발생.
});
} catch(e) {
print(e);
}
}
에러가 생기고 프로그램이 중단됩니다.
하지만 Zone을 쓰면 계속 프로그램이 실행됩니다.
1.2 Zone을 사용한 경우
xxxxxxxxxx
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
xxxxxxxxxx
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
xxxxxxxxxx
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 )
'플러터(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 |