哪一个:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

OR

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}

当前回答

如果你在Using()块中初始化的对象可能抛出任何异常,那么你应该使用第二种语法,否则两者同样有效。

在我的场景中,我必须打开一个文件,我在对象的构造函数中传递filePath,我在Using()块中初始化该对象,如果filePath错误/为空,它可能会抛出异常。在这种情况下,第二种语法是有意义的。

我的示例代码:-

try
{
    using (var obj= new MyClass("fileName.extension"))
    {

    }
}
catch(Exception ex)
{
     //Take actions according to the exception.
}

其他回答

我更喜欢第二个。也可以捕获与对象创建相关的错误。

如果你在Using()块中初始化的对象可能抛出任何异常,那么你应该使用第二种语法,否则两者同样有效。

在我的场景中,我必须打开一个文件,我在对象的构造函数中传递filePath,我在Using()块中初始化该对象,如果filePath错误/为空,它可能会抛出异常。在这种情况下,第二种语法是有意义的。

我的示例代码:-

try
{
    using (var obj= new MyClass("fileName.extension"))
    {

    }
}
catch(Exception ex)
{
     //Take actions according to the exception.
}

视情况而定。如果您正在使用Windows通信基础(WCF),使用(…){try…如果using语句中的代理处于异常状态,}将不能正常工作,即处理该代理将导致另一个异常。

就我个人而言,我相信最小处理方法,即只处理你在执行点上意识到的异常。换句话说,如果您知道在using中初始化一个变量可能会抛出一个特定的异常,那么我就用try-catch来封装它。类似地,如果在using体中可能发生一些与using中的变量没有直接关系的事情,那么我就用另一个try来包装它。我很少在catch中使用Exception。

不过我喜欢IDisposable,所以我可能有偏见。

从c# 8.0开始,您可以在某些条件下简化使用语句来摆脱嵌套块,然后它只适用于封闭块。

所以你的两个例子可以简化为:

using var myObject = new MyClass();
try
{
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

And:

try
{
   using var myObject = new MyClass();
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

这两点都很清楚;然后,这将两者之间的选择减少到您希望对象的作用域是什么,您希望在哪里处理实例化错误,以及您希望在什么时候处理它。

由于using块只是一个try/finally (MSDN)的语法简化,我个人会选择以下方法,尽管我怀疑它与你的第二个选择有很大的不同:

MyClass myObject = null;

try
{
    myObject = new MyClass();
    //important stuff
}
catch (Exception ex)
{
    //handle exception
}
finally
{
    if (myObject is IDisposable)
    {
        myObject.Dispose();
    }
}