web-dev-qa-db-ja.com

「using」ステートメントでtry / catchをどこに置くのですか?

可能性のある複製:
試行/キャッチ+使用、正しい構文

私はしたいと思います try/catch 以下:

        //write to file
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(message);
        }

try/catchusingステートメント内のブロック、またはその周囲?または両方?

23
Ryan R

Catchステートメントがusingステートメントで宣言された変数にアクセスする必要がある場合は、insideが唯一のオプションです。

Catchステートメントで、破棄する前にusingで参照されるオブジェクトが必要な場合は、insideが唯一のオプションです。

Catchステートメントがユーザーへのメッセージの表示など、期間が不明なアクションを実行し、それが発生する前にリソースを破棄したい場合は、outsideが最善のオプションです。

私がこれに似たscenerioを持っているときはいつでも、try-catchブロックは通常、コールスタックを使用していない別のメソッドにあります。このようにメソッド内で発生する例外を処理する方法をメソッドが知ることは一般的ではありません。

したがって、私の一般的な推奨事項は外にあり、外にあります。

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}
39

これが好ましい方法だと思います:

try
{
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine(message);
    }
}
catch(Exception ex)
{
   // Handle exception
}
13
CD..

とにかく、try/catchブロックが必要な場合は、usingステートメントではあまり効果がありません。ただ捨てて、代わりにこれを行います:

StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}
7
hemp