🧐

Flutterの try-catch の使い方をちゃんと理解する

に公開

Flutterアプリ開発では、エラーハンドリングが重要です。
特に、非同期処理やネットワーク通信時にはエラーが発生しやすいため、適切な try-catch の使い方を学ぶことで、アプリの安定性を向上させることができます。

1. try-catch の基本的な使い方

try-catch を使うと、エラーが発生したときにアプリのクラッシュを防ぎ、適切な処理を行えます。

dart
void main() {
  try {
    int result = 10 ~/ 0; // 0で割るエラー
    print(result);
  } catch (e) {
    print('エラーが発生しました: $e');
  }
}

catch のパターン

・catch (e) {} → 例外の内容を取得
・catch (e, stackTrace) {} → スタックトレースも取得(デバッグに役立つ)

dart
try {
  int result = 10 ~/ 0;
} catch (e, stackTrace) {
  print('エラー: $e');
  print('スタックトレース: $stackTrace');
}

2. 非同期処理 (async / await) の try-catch

Futureを扱う場合は、async / await を使うことが多く、これも try-catch でエラーハンドリングできます。

dart
Future<void> fetchData() async {
  try {
    final response = await fetchFromApi(); // 例: APIリクエスト
    print(response);
  } catch (e) {
    print('データ取得エラー: $e');
  }
}

Future<String> fetchFromApi() async {
  throw Exception('サーバーエラー');
}

3. on を使った特定の例外処理

on を使うと、特定の例外クラスごとに処理を分けることができます。

dart
try {
  throw FormatException('フォーマットエラー');
} on FormatException catch (e) {
  print('フォーマットエラー: $e');
} catch (e) {
  print('その他のエラー: $e');
}

4. finally で後処理を実行

finally を使うと、エラーが発生したかどうかに関係なく必ず実行される処理を記述できます。

dart
void process() {
  try {
    print('処理中...');
    throw Exception('エラー発生');
  } catch (e) {
    print('キャッチ: $e');
  } finally {
    print('後処理を実行');
  }
}

void main() {
  process();
}

5. rethrow でエラーを再スロー

一度キャッチしたエラーを、別の場所で処理するために再スロー (rethrow) できます。

dart
void someFunction() {
  try {
    throw Exception('エラー発生');
  } catch (e) {
    print('ログを記録: $e');
    rethrow; // 上位の `catch` へスロー
  }
}

void main() {
  try {
    someFunction();
  } catch (e) {
    print('メインでキャッチ: $e');
  }
}

6. try-catch を活用する場面

・APIリクエスト (http パッケージ)
・ファイル操作 (dart:io)
・Firestore / Firebase Auth
・JSONのパース
・数値計算(0除算 など)

まとめ

Flutterアプリでは try-catch を適切に活用することで、エラーが発生してもクラッシュを防ぎ、ユーザーに適切なフィードバックを提供できます。
特に async/await の処理では try-catch を組み合わせることが重要です。

Discussion