【问题标题】:How do I always get COMException instead of OutOfMemoryException?我如何总是得到 COMException 而不是 OutOfMemoryException?
【发布时间】:2012-12-03 21:44:37
【问题描述】:

我的 C# 代码使用一个 COM 对象。有时,COM 对象方法将返回 E_OUTOFMEMORY,但它会被转换为 System.OutOfMemoryException 而不是 System.Runtime.InteropServices.COMException,并带有适当的 ErrorCode。这对我来说是个问题,因为它使我的错误处理变得复杂——我希望所有由 COM 对象方法引起的错误指示都被抛出为 System.Runtime.InteropServices.COMException

当 COM 对象方法返回 E_OUTOFMEMORY 时,是否可以始终拥有 System.Runtime.InteropServices.COMException 而不是 System.OutOfMemoryException

【问题讨论】:

  • 功能,不是错误,你不能关闭它。 OOM 意味着 进程 耗尽了虚拟内存,而不是 COM 服务器。并且同样有可能打击托管分配。处理 OOM 是有问题的,你不能神奇地扩展 VM 大小。它应该在非常靠近调用站点的地方完成,以便您可以恢复程序状态。此时您知道 COM 服务器崩溃了。
  • @Hans Passant:太好了,除了 COM 服务器是 outproc 之外,因此调用过程不太关心它的 OOM 状态。

标签: c# .net com exception-handling com-interop


【解决方案1】:

这可能有点逃避,但为什么不将任何抛出 System.OutOfMemoryException 的代码包装在 Try/catch 中并重新抛出 System.Runtime.InteropServices.COMException

类似的东西:

    try
        {
            // COM Code here
        }
        catch (System.OutOfMemoryException ex)
        {
            throw new System.Runtime.InteropServices.COMException("E_OUTOFMEMORY", ex);
        }

【讨论】:

  • 这需要包装每个电话,我有几十个甚至几千个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多