〜ArgumentErrorをmain.dartでキャッチする方法〜
アプリ開発をしていると、「気づかないところでエラーが起きていた…」 という経験は誰しもあると思います。
特にFlutterでは、UI層のエラー・非同期処理のエラー・Dartレベルのエラーがそれぞれ異なる経路で流れるため、
「全部まとめてキャッチしたい!」と思った時に少し迷います。
そこで今回は、main.dartでエラーを一元的にリッスンする方法を整理してみます。
Flutterには最初から「UIフレームワーク内で発生したエラー」を捕まえるフックが用意されています。
これで、ArgumentErrorなどがウィジェットツリー内で発生したときに検知できます。
ただし、非同期処理のエラーまではカバーできません。
FutureやTimerなど、非同期処理で投げられた例外は FlutterError.onError
では拾えません。
そこで便利なのが runZonedGuarded
。
これを使うと、非同期処理で飛んできたエラーもキャッチできます。
バックエンド通信やタイマー処理が絡むアプリでは必須レベルです。
Flutter 3.3以降では、Dart VM自体が提供するエラーフックも用意されています。
これは、**「ここまで捕まらなければ本当にアプリが落ちる」**という最終防衛ライン。
CrashlyticsやSentryにエラーを送っておけば、調査時に役立ちます。
Flutterアプリのエラー監視は以下の三段構えで考えると安心です。
FlutterError.onError → UI層の例外
runZonedGuarded → 非同期処理の例外
PlatformDispatcher.onError → Dartレベルの例外
これらを組み合わせれば、ArgumentErrorを含め、アプリ内の「想定外エラー」を逃さずログに残せます。
アプリはユーザーの手元で予期せぬ環境に晒されます。
「落ちない」アプリを作ることは理想ですが、現実は落ちます。
だからこそ、落ちた時に「なぜ落ちたのか」を知る仕組みをmain.dartで仕込んでおくことが、実は開発者の一番の武器になります。