请考虑下面的代码,其中LockDevice()可能会失败并在自身上抛出异常。如果在finally块中引发异常,那么在C#中会发生什么?来自finally块内的异常
UnlockDevice(); try { DoSomethingWithDevice(); } finally { LockDevice(); // can fail with an exception }
请考虑下面的代码,其中LockDevice()可能会失败并在自身上抛出异常。如果在finally块中引发异常,那么在C#中会发生什么?来自finally块内的异常
UnlockDevice(); try { DoSomethingWithDevice(); } finally { LockDevice(); // can fail with an exception }
完全相同的事情,如果它不是在一个finally块中会发生 - 一个异常可能从这个点传播。如果需要,你可以内最后的try/catch来自:
try
{
DoSomethingWithDevice();
}
finally
{
try
{
LockDevice();
}
catch (...)
{
...
}
}
的方法被称为的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()
}
}
当然,如果可以对该方法引发的异常做一些建设性的事情,那么只有这样做才合适。当没有什么合适的时候抓住它是非常没用的。 – Paddy 2010-03-25 09:35:11
@Paddy你应该至少将它记录下来,以便以后审查它为什么会引发例外...... – balexandre 2010-03-25 10:06:08
我想说,这取决于你的系统如何设置来处理异常 - 在某些情况下,允许异常更有意义冒泡并离开系统的外层以记录所有异常,而不是通过记录行混淆您的代码。但是,如果吞下该异常,则应该确定将其记录下来。 – Paddy 2010-03-25 10:08:14
另一个很好的问题是“UnlockDevice解锁设备,但在进入试保护区之前后如果一个线程终止异常升高时会发生什么?”答案是:设备保持解锁状态。这看起来像不安全的代码。 – 2010-03-25 16:09:23