本文へスキップ
BecomeCoder

C#文法コース · 第6章 例外処理とnull安全 · レッスン46

finally と using

ブラウザで完結

導入

ファイルやネットワーク接続は「使い終わったら閉じる」必要があります。例外が起きても必ず後片付けを実行する仕組みが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は成功・例外にかかわらず必ず実行される(後片付けに使う)
  • usingIDisposableなリソースを、ブロックを抜けるとき自動的に閉じる
  • ファイル・DB接続・ネットワークはusingで扱うのが実務の基本

演習

// TODO: try で "作業中" を出力し、finally で "完了" を出力してください(例外は起こさなくてよい)
___
  • 期待される出力: 作業中 完了(2行)
ヒント1を見る

try { Console.WriteLine("作業中"); } finally { Console.WriteLine("完了"); }

ヒント2を見る

catchは省略でき、tryfinallyだけの組み合わせも書けます

まとめ

  • finallyは成功・失敗を問わず必ず実行される(後片付け向き)
  • usingIDisposableを自動的に閉じる
  • リソースの解放漏れを防ぐのがこれらの役目

次回: 自分で例外を発生させるthrowです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。