2010-07-26 85 views
2

可以在使用块内捕获异常,如果有的话,语法是什么?你可以在使用块吗?

因此,类似如下:

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

    catch() 
    { 
     creatingThing.Rollback(); 
    } 
} 

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

回答

15

你可以把一个try/catch内using声明,或外部:

using (...) 
{ 
    try 
    { 
     ... 
    } 
    catch 
    { 
     ... 
    } 
} 

或者......

try 
{ 
    using (...) 
    { 
     ... 
    } 
} 
catch 
{ 
    ... 
} 

但是,你不能只放一个没有try块的catch块。

根据您是否需要捕获由资源获取表达式引发的异常,是否希望资源在您的catch块执行之前被处置,以及是否需要访问资源变量在catch块内。

+0

Jon,在你的第二个代码示例中,如果在try块的使用部分内引发异常,资源是否仍然处置? – 2010-07-26 17:31:32

+2

@Maxim:是的,绝对。 – 2010-07-26 17:33:03

6

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

using (var creatingThing = new MyCreatingThing()) 
{ 
    try 
    { 
     creatingThing.CreateSomething(); 
    } 
    catch 
    { 
     creatingThing.Rollback(); 
    } 
} 
+2

但是,这不会赶上由构造抛出异常(尽管如果ctor抛出异常,他在catch中的行为将会成为一个问题) – 2010-07-26 16:42:10

+0

好吧,所以没有办法挂钩到使用?创建的隐式'try ... finally'中。 – fearofawhackplanet 2010-07-26 16:47:34

+0

@fear:正确。 – 2010-07-26 17:00:25

3

当然,只需添加使用里面的尝试:

using (var creatingThing = new MyCreatingThing()) 
{ 
    try 
    { 
    creatingThing.CreateSomething(); 
    } 
    catch(Exception ex) 
    { 
     creatingThing.Rollback(); 
    } 
} 
+0

此语法不正确。 – 2010-07-26 16:41:21

+0

@steven:是的,只是想展示如何添加'try'位,所以不用担心其余的问题,但最好是所有的都是正确的。 – 2010-07-26 16:44:09

+1

没有伤害。这就是为什么我更愿意发表评论而不是盲目下决心的原因。 :-) – 2010-07-26 16:59:30

6

注意,在一个使用确实是一个try /终于在幕后,所以它可能是更容易的代码,这样的说法:

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(); 
} 
+2

如果明确实施,您可能希望将'creatingThing'强制转换为'IDisposable'。 – 2010-07-26 17:01:21