我在哪里将try/catch与"using"语句放在一起?

Rya*_*n R 23 c# using-statement try-catch

可能重复:
try/catch + using,正确的语法

我想要try/catch以下内容:

        //write to file
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(message);
        }
Run Code Online (Sandbox Code Playgroud)

我把这些try/catch块放在using声明中还是周围?或两者?

Jef*_*dge 38

如果您的catch语句需要访问using语句中声明的变量,那么inside是您唯一的选择.

如果您的catch语句在处理之前需要使用中引用的对象,那么inside是您唯一的选择.

如果您的catch语句采取未知持续时间的操作,例如向用户显示消息,并且您希望在此之前处置您的资源,那么外部是您的最佳选择.

每当我有一个与此类似的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • "外面的外面"+1 (9认同)

CD.*_*D.. 13

我想这是首选方式:

try
{
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine(message);
    }
}
catch(Exception ex)
{
   // Handle exception
}
Run Code Online (Sandbox Code Playgroud)


hem*_*emp 6

如果你还需要一个try/catch块,那么using语句不会给你带来太大的收益.只是放弃它,而是这样做:

StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

  • @Henk:您是否意识到这是一个完全主观的观点?我碰巧认为块块可读,方便和简单.当有意义时,using语句是很好的语法糖,但在这种情况下它没有意义. (12认同)
  • 更正:using语句告诉GC没有.它被(通过C#编译器)展开到try/finally(在IL中),其中包含对对象的IDisposable.Dispose()方法实现的调用.它确实作为开发人员应该发生dispose的指示器,类似于在finally块中显式调用Dispose的方式,表明应该发生dispose. (7认同)
  • 一个是不太可能忘记在finally块中调用dispose而不是忘记将对象包装在using块中(正如许多开发人员所做的那样).来自MSDN"最后一块可用于清理任何资源......"我认为我们已经彻底击败了这一块. (5认同)
  • @hmp在这个话语中非常正确.虽然我仍然鼓励在try/catch中使用`using`只是为了保持一致性,但如果程序员不知道他们应该处理一个对象,那么这两种模式都不重要.这完全符合偏好,根据定义,它是主观的.我喜欢把它放在`finally`块中的想法,但我不会简单地因为我害怕让其他可能不理解的程序员感到困惑. (3认同)
  • 非常可怕的代码。没有理由放弃using块的便利性(可读性,简单性)。 (2认同)
  • 来自 MSDN 编码约定:“如果您有一个 try-finally 语句,其中 finally 块中的唯一代码是对 Dispose 方法的调用,请改用 using 语句。” (2认同)
  • 当然。但是,try-finally 语句与 try-catch-finally 语句不同。 (2认同)