返回和最后一个子句 - 不一致的行为

时间:2010-12-09 13:25:03

标签: c# .net

我遇到了一些行为不一致的奇怪(IMO)代码。

try
{
   if (helperMethod())
   {
       return 0;
   }

   return 0;
 }
 catch(Exception e)
 {
    // Log and throw
 }
 finally
 {
     // Do a lot of stuff after value has been returned
 }

它位于一个方法中,该方法由VBA通过将COM对象传递给我的DLL来调用。当它刚刚运行时,我在C#中没有异常,但是我得到了一个VBA例外。

当我在调试中运行它时,我在任何地方都没有异常。

我的猜测是finally子句中的逻辑需要花费一秒钟才能运行,并且此时0已经被该方法的主体返回。

我可以用几种方式重写它,但我不知道以这种方式编写代码是否常见......?

谢谢

编辑:当我返回0时,COM对象是否会被释放?在那种情况下,它在finally子句中不再可用。

2 个答案:

答案 0 :(得分:2)

COMException可能会导致.NET CLR引擎崩溃,导致引擎无法运行finally代码。在这些情况下,您将在EventLog中看到一个条目。

我在WMI中看到了很多这些。 邪恶,邪恶......

答案 1 :(得分:1)

我想在这里你可能正在尝试(没有双关语)以奇怪的方式使用finally块。框架文档最后表示如下:

  

finally块对于清理try块中分配的任何资源非常有用。

你应该在你的try块中工作(或者在try-catch-finally构造之外,如果它只是覆盖潜在的异常条件,而不是后续处理返回的数据)你的finally块应该只释放分配的任何资源无论异常或正常终止,都需要释放的尝试。