为什么没有#com_error派生自std :: exception或std :: runtime_error?

时间:2017-10-13 11:20:33

标签: c++ exception com

Windows COM support types(在comdef.h中找到)包含一个名为_com_error的异常类型,当遇到COM错误时会抛出该异常类型。

考虑到_com_error抛出的类型,并且考虑到它体现了运行时错误的本质;这似乎完全属于std::runtime_error

的领域

有没有人有任何背景信息,为什么_com_error不会从标准异常类型继承? std::exceptionstd::runtime_error类型已经 long 时间。

1 个答案:

答案 0 :(得分:0)

我不是微软的工程师,因此我的回答只是一个猜测而不是正式答案。

答案是:ABI兼容性。

COM是一种技术,它允许使用不同编程语言编写并在不同平台上运行的不同技术进行通信和传递数据。

Visual Basic,C#,JScript,F#等人对C ++对象,构造函数,析构函数和错误层次结构一无所知。使_com_error继承自std::exception和co。,只会使所有技术更难以使用此类型并使用。

想象一下,如果您想将该错误从C ++程序传递给JScript程序 - JSCript引擎必须知道C ++对象的外观,以及何时以及如何清理它们。

这样做几乎取消了COM作为“交叉技术胶水”的重点。

您可能会问“那么这个类如何实现C ++抽象类?不会引发同样的问题吗?”
嗯,答案是虚拟表的“技巧”是一种简单的技术来编组其他技术,甚至其他编程语言如C#和visual basic也使用相同的虚拟表模型供自己使用。

析构函数和手动内存管理非常难以编组,尤其是在其他技术被垃圾收集时。