導入
ファイルやネットワーク接続は「使い終わったら閉じる」必要があります。例外が起きても必ず後片付けを実行する仕組みがfinally、そしてそれを自動化するのがusingです。
図解
flowchart TB
T["try"] --> F["finally<br/>(成功でも例外でも必ず実行)"]
C["catch"] --> F
T -.例外.-> C
F --> DONE["後片付け完了"]
style F fill:#e8f5e9
サンプル
try
{
Console.WriteLine("処理開始");
throw new Exception("途中で失敗");
}
catch (Exception)
{
Console.WriteLine("エラーを処理");
}
finally
{
// 成功でも失敗でも、必ずここが実行される
Console.WriteLine("後片付け(finally)");
}
// 処理開始 / エラーを処理 / 後片付け(finally)
// using: IDisposable なものを使い終わったら自動で Dispose(後片付け)してくれる
using (var writer = new StringWriter())
{
writer.Write("using ブロックを抜けると自動で閉じられる");
Console.WriteLine(writer.ToString());
} // ここで writer.Dispose() が自動的に呼ばれる
finallyは成功・例外にかかわらず必ず実行される(後片付けに使う)usingはIDisposableなリソースを、ブロックを抜けるとき自動的に閉じる- ファイル・DB接続・ネットワークは
usingで扱うのが実務の基本
演習
// TODO: try で "作業中" を出力し、finally で "完了" を出力してください(例外は起こさなくてよい)
___
- 期待される出力:
作業中完了(2行)
ヒント1を見る
try { Console.WriteLine("作業中"); } finally { Console.WriteLine("完了"); }
ヒント2を見る
catchは省略でき、tryとfinallyだけの組み合わせも書けます
まとめ
finallyは成功・失敗を問わず必ず実行される(後片付け向き)usingはIDisposableを自動的に閉じる- リソースの解放漏れを防ぐのがこれらの役目
次回: 自分で例外を発生させるthrowです。