2010-03-25 57 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

相关问题