2010-03-25 28 views
5

請考慮下面的代碼,其中LockDevice()可能會失敗並在自身上拋出異常。如果在finally塊中引發異常,那麼在C#中會發生什麼?來自finally塊內的異常

 
UnlockDevice(); 

try 
{ 
    DoSomethingWithDevice(); 
} 
finally 
{ 
    LockDevice(); // can fail with an exception 
} 
+0

另一個很好的問題是「UnlockDevice解鎖設備,但在進入試保護區之前後如果一個線程終止異常升高時會發生什麼?」答案是:設備保持解鎖狀態。這看起來像不安全的代碼。 – 2010-03-25 16:09:23

回答

10

完全相同的事情,如果它不是在一個finally塊中會發生 - 一個異常可能從這個點傳播。如果需要,你可以內最後的try/catch來自:

try 
{ 
    DoSomethingWithDevice(); 
} 
finally 
{ 
    try 
    { 
     LockDevice(); 
    } 
    catch (...) 
    { 
     ... 
    } 
} 
-2

的方法被稱爲的try/catch

哪裏是你的收穫?

UnlockDevice(); 

try 
{ 
    DoSomethingWithDevice(); 
} 
catch(Exception ex) 
{ 
    // Do something with the error on DoSomethingWithDevice() 
} 
finally 
{ 
    try 
    { 
     LockDevice(); // can fail with an exception 
    } 
    catch (Exception ex) 
    { 
     // Do something with the error on LockDevice() 
    } 
} 
+1

當然,如果可以對該方法引發的異常做一些建設性的事情,那麼只有這樣做才合適。當沒有什麼合適的時候抓住它是非常沒用的。 – Paddy 2010-03-25 09:35:11

+0

@Paddy你應該至少將它記錄下來,以便以後審查它爲什麼會引發例外...... – balexandre 2010-03-25 10:06:08

+0

我想說,這取決於你的系統如何設置來處理異常 - 在某些情況下,允許異常更有意義冒泡並離開系統的外層以記錄所有異常,而不是通過記錄行混淆您的代碼。但是,如果吞下該異常,則應該確定將其記錄下來。 – Paddy 2010-03-25 10:08:14

相關問題