c# - Return 和 finally 子句 - 不一致的行为

标签 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
 }

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

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

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

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

谢谢

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

最佳答案

COMException 会使您的 .NET CLR 引擎崩溃,这样引擎就没有机会运行 finally 代码。在这些情况下,您会在事件日志中看到一个条目。

我在 WMI 中看到了很多这样的情况。 邪恶,邪恶......

关于c# - Return 和 finally 子句 - 不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4398663/

相关文章:

c# - 当我更改继承类中同名方法的代码时,我不需要使用属性覆盖和虚拟。这是为什么?

c# - CSharpTest.Net.Collections.BPlusTree RecentCache 错误?

.net - MSChart中Series和DataPoint的所有可用CustomProperty的最终列表

c# - 命名空间和类之间的名称冲突

c# - MySql gridview删除命令

c# - .NET 的 RX - 从 Disposable.Create 中调用 observer.OnCompleted 时没有任何反应

c# - 剪贴板.设置比较

c# 在不使用调度程序的情况下访问 Task 中的 ui 元素

c# - ImmutableArray<T> 和 ImmutableList<T> 的区别

c# - 如何使用 jQuery 数据表和 Controller 内的 HTML 渲染在 .Net MVC 中实现服务器端处理