例外の発生とは関係なく、最後に処理を実行したいんですけど、どうやったらいいですか?
その場合は、finallyブロックを使えばいいですよ。finallyブロックでは、例外の発生有無に関わらず、必ず実行される処理を書くことができます。
例外処理の後処理(finally)
構造化例外処理で、例外の発生有無にかかわらず必ず実行したい処理がある場合は、finallyブロックを利用することができます。
finally{
処理
}
finallyブロックは、例外処理の最後に実行されるため、ファイルのクローズやオブジェクトの解放など、例外の発生に関係なく行いたい処理を記述することができます。
また、finallyブロック内では、catchブロック内にreturnステートメントが記述されていても実行されるため、必ず実行されることが保証されます。
StreamReader reader = null;
try
{
// 例外をスローする可能性があるコード
reader = new StreamReader("invalid_file.txt");
Console.WriteLine(reader.ReadToEnd());
}
catch (FileNotFoundException ex)
{
// FileNotFoundException例外を処理するコード
Console.WriteLine("ファイルが見つかりませんでした。");
}
finally
{
// 例外の有無にかかわらず、必ず実行されるコード
if (reader != null)
{
reader.Close();
}
}
Dim reader As StreamReader = Nothing
Try
' 例外をスローする可能性があるコード
reader = New StreamReader("invalid_file.txt")
Console.WriteLine(reader.ReadToEnd())
Catch ex As FileNotFoundException
' FileNotFoundException例外を処理するコード
Console.WriteLine("ファイルが見つかりませんでした。")
Finally
' 例外の有無にかかわらず、必ず実行されるコード
If reader IsNot Nothing Then
reader.Close()
End If
End Try
このサンプルでは、 try ステートメント内で StreamReader オブジェクトを生成しようとしています。
しかし、ファイルが存在しないため、FileNotFoundException例外がスローされます。そのため、 catch ステートメントでFileNotFoundException例外を処理するコードが実行されます。
finally ステートメントでは、StreamReaderオブジェクトがnullでない場合にのみ、Closeメソッドを呼び出しています。これにより、StreamReaderオブジェクトが生成された場合にのみ、Closeメソッドが呼び出されるようになります。
リスキリングでキャリアアップしてみませんか?
リスキリング(学び直し)は、経済産業省が推奨しており、
今だけ、最大70%のキャッシュバックを受けることができます。
最大70%の給付金が出るおすすめのプログラミングスクール!
国策で予算が決められているため申し込みが多い場合は早期に終了する可能性があります!
興味のある方はすぐに確認しましょう。
ファイルやデータベースを利用した際の後処理を記述する
ファイルを開いた後に必ずクローズしたい場合や、データベース接続を開いた後に必ず切断したい場合などに、finallyブロックを使用することで、例外の発生有無にかかわらず、必ず実行される処理を記述することができます。
また、finallyブロックは、tryステートメント内でreturnステートメントが使用されている場合でも、必ず実行されるため、リソースの解放やクローズなど、必ず実行されるべき処理を記述するのに適しています。
他にも、finallyブロックは、tryステートメント内で例外が発生した場合でも、必ず実行されるため、例外発生時の後始末やログ出力などを行うことができます。
コメント