可以在使用块内捕获异常,如果有的话,语法是什么?你可以在使用块吗?
因此,类似如下:
using (var creatingThing = new MyCreatingThing())
{
creatingThing.CreateSomething();
catch()
{
creatingThing.Rollback();
}
}
可以这样做?或者我是否需要手动编写此代码(即没有使用)?
可以在使用块内捕获异常,如果有的话,语法是什么?你可以在使用块吗?
因此,类似如下:
using (var creatingThing = new MyCreatingThing())
{
creatingThing.CreateSomething();
catch()
{
creatingThing.Rollback();
}
}
可以这样做?或者我是否需要手动编写此代码(即没有使用)?
你可以把一个try/catch内using
声明,或外部:
using (...)
{
try
{
...
}
catch
{
...
}
}
或者......
try
{
using (...)
{
...
}
}
catch
{
...
}
但是,你不能只放一个没有try块的catch块。
根据您是否需要捕获由资源获取表达式引发的异常,是否希望资源在您的catch块执行之前被处置,以及是否需要访问资源变量在catch块内。
您不能隐式地登记编译器生成的try...finally
块(对于using
语句)。你必须添加其他try
语句,该语句将嵌套所生成的块中:
using (var creatingThing = new MyCreatingThing())
{
try
{
creatingThing.CreateSomething();
}
catch
{
creatingThing.Rollback();
}
}
但是,这不会赶上由构造抛出异常(尽管如果ctor抛出异常,他在catch中的行为将会成为一个问题) – 2010-07-26 16:42:10
好吧,所以没有办法挂钩到使用?创建的隐式'try ... finally'中。 – fearofawhackplanet 2010-07-26 16:47:34
@fear:正确。 – 2010-07-26 17:00:25
当然,只需添加使用里面的尝试:
using (var creatingThing = new MyCreatingThing())
{
try
{
creatingThing.CreateSomething();
}
catch(Exception ex)
{
creatingThing.Rollback();
}
}
此语法不正确。 – 2010-07-26 16:41:21
@steven:是的,只是想展示如何添加'try'位,所以不用担心其余的问题,但最好是所有的都是正确的。 – 2010-07-26 16:44:09
没有伤害。这就是为什么我更愿意发表评论而不是盲目下决心的原因。 :-) – 2010-07-26 16:59:30
注意,在一个使用确实是一个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();
}
如果明确实施,您可能希望将'creatingThing'强制转换为'IDisposable'。 – 2010-07-26 17:01:21
Jon,在你的第二个代码示例中,如果在try块的使用部分内引发异常,资源是否仍然处置? – 2010-07-26 17:31:32
@Maxim:是的,绝对。 – 2010-07-26 17:33:03