Flutter - runZonedGuarded
Flutter 에서 Isolate 를 사용하는 경우 내부에서 발생하는 예외가 예외 처리 코드를 작성했음에도 불구하고 Unhandled exception 으로 발생하는 경우가 있다.
예를 들어 Socket Write 중에 다음과 같은 예외가 발생하는 경우 Unhandled 로 처리되고 프로그램이 올바르게 예외 처리를 하지 않는다.
SocketException: Write failed (OS Error: Broken pipe, errno = 32)
E/flutter (28440): [ERROR:flutter/runtime/dart_isolate.cc(1148)] Unhandled exception:
E/flutter (28440): SocketException: Write failed (OS Error: Broken pipe, errno = 32), address = 0.0.0.0, port = 9999
E/flutter (28440): #0 _NativeSocket.write (dart:io-patch/socket_patch.dart:1182)
E/flutter (28440): #1 _RawSocket.write (dart:io-patch/socket_patch.dart:1897)
E/flutter (28440): #2 _Socket._write (dart:io-patch/socket_patch.dart:2334)
E/flutter (28440): #3 _SocketStreamConsumer.write (dart:io-patch/socket_patch.dart:2082)
E/flutter (28440): #4 _SocketStreamConsumer.addStream.<anonymous closure> (dart:io-patch/socket_patch.dart:2056)
E/flutter (28440): #5 _RootZone.runUnaryGuarded (dart:async/zone.dart:1620)
E/flutter (28440): #6 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341)
E/flutter (28440): #7 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271)
E/flutter (28440): #8 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:733)
E/flutter (28440): #9 _StreamController._add (dart:async/stream_controller.dart:607)
E/flutter (28440): #10 _StreamController.add (dart:async/stream_controller.dart:554)
E/flutter (28440): #11 _StreamSinkImpl.add (dart:io/io_sink.dart:136)
E/flutter (28440): #12 _IOSinkImpl.write (dart:io/io_sink.dart:269)
E/flutter (28440): #13 _Socket.write (dart:io-patch/socket_patch.dart:2172)
이러한 상황에서 Isolate 시작 함수의 코드를 runZonedGuarded 로 감싸면 Unhandled exception 을 처리할 수 있다.
댓글
댓글 쓰기