👻

try-catchとon Exception catch

2023/12/21に公開

Overview

try catchで書くとよくないと言われた。on Exception catch の方がいいのか?

try-catchとon Exception catchの違いは、キャッチする例外の種類です。

summary

try-catchはすべての例外をキャッチします。これは、予期しない例外までキャッチしてしまう可能性があり、それが問題になる場合があります。例えば、プログラムのバグによって発生した例外をキャッチしてしまうと、そのバグが見つけにくくなる可能性があります。

一方、on Exception catchはException型の例外だけをキャッチします。Dartでは、Exceptionはプログラムの正常な操作中に発生する可能性のあるエラーを表すために使用されます。したがって、on Exception catchを使用すると、予期した例外だけをキャッチし、予期しない例外はプログラムの外部に伝播させることができます。

import 'dart:async';

enum AuthenticatedState {
  authenticated,
  unauthenticated,
}

class User {
  final String id;
  final String name;

  User({required this.id, required this.name});
}
// わざと例外をスローするAPIをシミュレートする
Future<User> fetchUserFromApi() async {
  // APIからユーザー情報を取得するロジックを書く
  // ここでは、エラーをシミュレートするために例外をスローします
  throw Exception('Failed to fetch user');
}

Future<AuthenticatedState> checkAuthentication() async {
  try {
    // ここでExceptionがスローされると、catchブロックが実行されます
    final user = await fetchUserFromApi();
    print('User fetched: ${user.name}');
    return AuthenticatedState.authenticated;
  } on Exception catch (e) {
    print('Error👻: $e');
    return AuthenticatedState.unauthenticated;
  } finally {
    print('Finished checking authentication');
  }
}

void main() async {
  final state = await checkAuthentication();
  print('Authentication state: $state');
}

実行結果:

Connecting to VM Service at ws://127.0.0.1:57563/ZflyFzz8Qp4=/ws
Error👻: Exception: Failed to fetch user
Finished checking authentication
Authentication state: AuthenticatedState.unauthenticated

Exited.

thoughts

どちらを使用するかは、あなたがどのような例外をキャッチしたいかによります。予期した例外だけをキャッチしたい場合は、on Exception catchを使用すると良いでしょう。

try catchで書くと、Lintの警告が出たり、エラーハンドリングの対象でないものをcatchしてしまうということがありました。
try catch = 例外処理できてるよではない...

Discussion