在COM基于Windows资源管理器外壳扩展中,错误条件使用从COM接口方法返回的HRESULT
返回值来表示。
但是,如果在COM接口方法的主体内(或在COM方法中直接或间接调用的某个C++对象的方法内)抛出C++异常(例如std::runtime_error
、std::bad_alloc
、std::invalid_argument
等),会发生什么?
这只是一个未定义的行为吗?
还是C++异常以某种方式被转换为Win32结构化异常(SEH)
如果是,转换过程的机制是什么?
允许异常跨越COM边界是禁止的,并且行为是未指定的。发生的情况取决于您使用的C++编译器。如果您使用MSVC++,那么,是的,C++异常会出现在SEH之上。MinGW在GCC中很受欢迎,但事实并非如此。
这使得在技术上客户端程序可以捕获异常。例如,.NET CLR将非托管异常转换为托管SEHException。然而,这纯粹是出于诊断原因,允许程序以可控的方式关闭,并提供适当的错误消息和堆栈跟踪。事实上,抓住这个例外不太可能有好的结局。根据定义,您无法处理异常,您不希望恢复COM服务器的状态。该异常当然绕过了COM服务器中通常期望执行的代码。内存泄漏是典型的结果。没有被释放的锁是无法诊断地挂起程序的好方法。如果您只是继续尝试使用服务器,则可能会出现重复的异常。只有程序关闭才是合理的方法。