👻
try-catchとon Exception catch
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