🙄

【Flutter + Firebase】FirebaseAuth の処理で、Exception を拾えない問題の解決

2023/02/02に公開

ケース

Flutter で Firebase Authentication にアカウント登録する処理をする。

問題

FirebaseAuth でアカウントを登録する処理に際しての Exception が起きてもそこでなぜか拾えず try-catch の catch {} 部分がシカトされ、むしろ他の自分で実装していない部分に Exception を横取りされるという問題に出会した。

↓コード

// ~(中略)~
try {
  final auth = FirebaseAuth.instance;

  return await auth.createUserWithEmailAndPassword(
    email: email,
    password: password,
  );
} on PlatformException catch (e) {
  print(e.code);
}
// ~(中略)~

解決

catch で受け取る際の on PlatformException をより具体的な FirebaseAuthException に直したら、すんなり受け取ってくれるようになった。

おそらく PlatformException だったから Exception を受け取れる範囲が広く、他の catch 部分に Exception を横取りされてしまっていたのだと思う。
より明確な Exception にすることで、自分が意図する部分での try-catch で Exception を拾えるようになったらしい。

↓改コード

// ~(中略)~
try {
  final auth = FirebaseAuth.instance;

  return await auth.createUserWithEmailAndPassword(
    email: email,
    password: password,
  );
} on FirebaseAuthException catch (e) {
  print(e.code);
}
// ~(中略)~

before → after

コメント部分は変更なし

before

// ~(中略)~
try {
  // final auth = FirebaseAuth.instance;

  // return await auth.createUserWithEmailAndPassword(
    // email: email,
    // password: password,
  // );
} on PlatformException catch (e) {
  // print(e.code);
}
// ~(中略)~

after

// ~(中略)~
try {
  // final auth = FirebaseAuth.instance;

  // return await auth.createUserWithEmailAndPassword(
    // email: email,
    // password: password,
  // );
} on FirebaseAuthException catch (e) {
  // print(e.code);
}
// ~(中略)~

まとめ

今後、try-catch で Exception を拾う場合は、on ~~Exception のところをより具体的な Exception(今回の場合:×PlatformException → ○FirebaseAuthException)にして拾うべきだなと学んだ。

おわりに

以上

参考になりましたら幸いです。
初心者ゆえ、ご指摘、アドバイス等ございましたら、是非ともよろしくお願いいたします。

Discussion