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
'안드로이드 > Flutter' 카테고리의 다른 글
flutter - 이미지를 동그랗게 만드는 위젯 (0) | 2020.06.08 |
---|---|
flutter Widget AboutDialog (flutter Widget of the week at 5.30) (0) | 2020.06.04 |
API에 있는 데이터를 한방에 Dart 언어로 변환시켜주는 사이트가 있다!? (0) | 2020.05.29 |
숫자 사이마다 콤마(,) 하는방법 (0) | 2020.05.28 |
Flutter Bloc패턴, http 통신 http.get 예제 (0) | 2020.05.27 |