哪一个:

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
}

当前回答

这里有一件重要的事情我要指出:第一个将不会捕获调用MyClass构造函数引起的任何异常。

其他回答

两者都是有效的语法。这实际上取决于您想做什么:如果您想捕获与创建/处理对象相关的错误,请使用第二种方法。如果不是,就用第一个。

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

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

如果catch语句在释放之前需要using中引用的对象,那么inside是唯一的选择。

如果您的catch语句执行一个持续时间未知的操作,例如向用户显示一条消息,并且您希望在此发生之前处理您的资源,那么外部是您的最佳选择。

每当我遇到类似于此的场景时,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);
    }
}

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

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

我的示例代码:-

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

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

从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
}

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