2010-07-26 104 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

相關問題