c++ - 保护 COM 接口(interface)免受异常影响

标签 c++ exception com exception-handling

我有几十个对象通过 COM 接口(interface)公开,每个对象都有很多方法,总共有几百个方法。这些接口(interface)将我的应用程序中的业务对象公开给脚本引擎。

我的任务是保护这些方法中的每一个不被抛出异常(捕获它们并使用 COM 的 Error() 函数返回错误,顺便说一下,我找不到任何文档因为不可能谷歌)。据我了解,这需要我在这些方法中的每一个的内部添加一个 try/catch。对于这数百种方法中的每一种方法,catch block 都将是相似或相同的,这有强烈的问题气味(严重违反了 DRY 原则),但我想不出任何方法来避免更改每种方法。据我所知,这些方法由 COM 直接调用,没有我可以 Hook 以捕获异常的中间代码。我目前最好的想法是为 catch block 制作一个宏,但它有自己的代码味道。谁能想出更好的方法?

顺便说一句,我的应用程序的异常不是从 std::exception 派生的,所以如果有某种 COM 自动处理标准异常的方法,它也无济于事。遗憾的是,我无法更改现有异常以派生自 std::exception。

最佳答案

最可靠的C++方式是在这里使用宏。我已经准备好接受反对票,但我们多年来一直在使用这个解决方案,到目前为止还没有发现任何严重的问题。

定义一个“开始方法”宏用于清除IErrorInfotry { 以及用于} catch 和错误处理的“结束方法”。如果您正确设计宏 - 将除了最必要的错误处理代码之外的所有代码都放入辅助函数中,这将是一个可容忍且可靠的解决方案,代码看起来干净,可维护性适中。

是的,那个doesn't look good at all ,但至少它是实现您想要的目标的可靠且符合标准的方式。

关于c++ - 保护 COM 接口(interface)免受异常影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724366/

相关文章:

java - 从嵌套 HashMap 中删除条目时java中的ConcurrentModificationException

com - 控制其他应用程序的音量

windows - 为什么我不需要在 COM 线程内创建的线程中调用 CoInitialize?

c++ - 继承QObject的类中的方法在调用时被标识为属性,而不运行方法

java - 当输入字符串而不是整数时创建 Java 异常

java - 如何将 messages.properties 键发送到 Controller 中引发的异常?

c# - 如何为 COM 编码流

c++ - 在 C++ `multimap` 中,如何有效地获取 `mapped_type` 元素的集合而不重复?

c++ - 如何在 C++ 中通过名称 (std::string) 调用函数?

java - Eratosthenes算法的并行筛寻找素数