可以在使用塊內捕獲異常,如果有的話,語法是什麼?你可以在使用塊嗎?
因此,類似如下:
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