なんだこれは
以下のようなコードのエラー、キャッチできませんよね(多分)
非同期で処理を動かしつつ別の操作をユーザにはやらせるも、裏で動いてる非同期処理でエラーが起きた場合などにダイアログを出したい!みたいなときに詰まりました。
それに対応したときの方法をご紹介します
きれいな解決方法ではないです。その点はご了承下さい。いい方法あったら知りたい‥
class HogeWidget {
Widget build(Context buildContext) {
return ElevatedButton(
child: Text('hoge');
onPressed: () {
try {
fuga();
Navigator.of(context).pushNamed('/aaaa');
} on Exception catch(e) {
// ここには辿り着けない
}
}
);
}
}
// 初期化っぽい処理とか。この中の処理はawaitしないのでasyncも付けない。
void fuga() {
// 適当な処理がここに入る
piyo();
// 適当な処理がここに入る
}
Future<void> piyo() async {
throw Exception('突然の死');
}
こうする
fuga
関数にエラー時の処理を渡すことにしました。めんどくさいね。
class HogeWidget {
Widget build(Context buildContext) {
return ElevatedButton(
child: Text('hoge');
onPressed: () {
fuga(
onError: () {
// ダイアログ出したりする
},
);
Navigator.of(context).pushNamed('/aaaa');
}
);
}
}
// 初期化っぽい処理とか。この中の処理はawaitしないのでasyncも付けない。
void fuga({void Function()? onError}) {
// 適当な処理がここに入る
piyo().catchError((_) => onError == null ? null : onError());
// 適当な処理がここに入る
}
Future<void> piyo() async {
throw Exception('突然の死');
}
さいごに
人類は未だに使いやすくて安全なエラー処理にたどり着いていないような気がする。