1. ホーム
  2. c#

[解決済み】try {...} finally {...} は良くて、try {...} catch{} はダメなのはなぜ?

2022-04-11 23:26:32

疑問点

引数なしでcatchを使うのは悪い形式だ、特にcatchが何もしない場合はそうだ、という意見を見たことがあります。

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
catch   // No args, so it will catch any exception
{}
reader.Close();

しかし、これは良い形とされています。

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
finally   // Will execute despite any exception
{
  reader.Close();
}

私の知る限り、finallyブロックにクリーンアップコードを入れるのとtry..catchブロックの後にクリーンアップコードを入れることの違いは、tryブロックにreturn文がある場合だけです(その場合、finallyのクリーンアップコードは実行されますが、try..catchの後のコードは実行されません)。

そうでなければ、finallyの何がそんなに特別なのでしょうか?

どのように解決するのか?

大きな違いは try...catch は例外を飲み込み、エラーが発生したことを隠します。 try..finally はクリーンアップコードを実行し、例外を処理することを知っている何かによって処理されるために、例外を継続させます。