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 을 처리할 수 있다.

댓글

이 블로그의 인기 게시물

react + typescript + leaflet