关于c#:我在哪里把try / catch与“using”语句放在一起?

Where do I put try/catch with “using” statement?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
try/catch + using, right syntax

我想做以下的事情:

1
2
3
4
5
        //write to file
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(message);
        }

我是把try/catch块放在using语句中,还是放在它周围?还是两者兼而有之?


如果catch语句需要访问using语句中声明的变量,那么只有inside选项。

如果catch语句在释放前需要在using中引用的对象,则只有inside选项。

如果catch语句执行的操作持续时间未知,例如向用户显示消息,并且您希望在执行该操作之前释放资源,那么outside是您的最佳选择。

每当我有一个与此类似的scenerio时,try-catch块通常位于调用堆栈上方的另一个方法中。对于一个方法来说,知道如何处理在它内部发生的异常是不典型的。

所以我一般的建议是在外面。

1
2
3
4
5
6
7
8
9
10
11
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);
    }
}


我想这是最好的方法:

1
2
3
4
5
6
7
8
9
10
11
try
{
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine(message);
    }
}
catch(Exception ex)
{
   // Handle exception
}


如果您无论如何都需要一个try/catch块,那么using语句不会给您带来太多好处。把它扔了,改为这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}