你能抓住一个使用区吗?

fea*_*net 2 c# exception-handling using-statement try-catch

可以在使用块内捕获异常,如果是,那么语法是什么?

所以,如下所示:

using (var creatingThing = new MyCreatingThing())
{
    creatingThing.CreateSomething();

    catch()
    {
        creatingThing.Rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?或者我是否需要手动编写此代码(即不使用)?

Jon*_*eet 15

您可以在using语句中或外部放置try/catch :

using (...)
{
    try
    {
        ...
    }
    catch
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

要么...

try
{
   using (...)
   {
       ...
   }
}
catch
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,您不能在没有try块的情况下放置catch块.

根据您是否需要捕获资源获取表达式抛出的异常,是否希望在执行catch块之前处理资源以及是否需要访问catch块中的资源变量来选择正确的一个.

  • @Maxim:是的,绝对的. (2认同)

Jef*_*nal 6

您不能隐式地登记try...finally编译器生成的块(对于using语句).您必须添加另一个try语句,该语句将嵌套在生成的块中:

using (var creatingThing = new MyCreatingThing())
{
    try
    {
        creatingThing.CreateSomething();
    }   
    catch
    {
        creatingThing.Rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是这不会捕获构造函数抛出的异常(尽管如果ctor抛出异常,他在catch中的操作会有问题) (2认同)

Jam*_*ran 6

注意,一个使用实际上是一个尝试/最后的封面,所以它可能更容易代码:

MyCreatingThing creatingThing = null;
try
{
    creatingThing = new MyNCreatingThing())
    creatingThing.CreateSomething(); 
}    
catch() 
{ 
      Console.WriteLine("An Exception happened");
      if (creatingThing !=null)
          creatingThing.Rollback(); 
}
finally
{
      if (creatingThing !=null)
           creatingThing.Dispose(); 
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望将`creatingThing`强制转换为`IDisposable`,以防它显式实现. (2认同)