我遇到了一些行为不一致的奇怪(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子句中不再可用。
答案 0 :(得分:2)
COMException可能会导致.NET CLR引擎崩溃,导致引擎无法运行finally代码。在这些情况下,您将在EventLog中看到一个条目。
我在WMI中看到了很多这些。 邪恶,邪恶......
答案 1 :(得分:1)
我想在这里你可能正在尝试(没有双关语)以奇怪的方式使用finally块。框架文档最后表示如下:
finally块对于清理try块中分配的任何资源非常有用。
你应该在你的try块中工作(或者在try-catch-finally构造之外,如果它只是覆盖潜在的异常条件,而不是后续处理返回的数据)你的finally块应该只释放分配的任何资源无论异常或正常终止,都需要释放的尝试。