跨越COM方法边界的C++异常会发生什么
What happens to C++ exceptions crossing COM method boundaries?
在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服务器中通常期望执行的代码。内存泄漏是典型的结果。没有被释放的锁是无法诊断地挂起程序的好方法。如果您只是继续尝试使用服务器,则可能会出现重复的异常。只有程序关闭才是合理的方法。
相关文章:
- 是什么导致了Unity 3D中的"错误线程异常"?
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 您应该在什么时候创建自己的异常类型
- C++ 捕获异常后进行清理的标准方法是什么?
- 我一直得到'std::invalid_argument'什么():似乎无缘无故地抛出 stoi 异常?
- 终端(bash)如何知道引发了什么异常
- 什么时候在 c++ 中使用 exit() 与异常更好?
- std::p riority_queue::p op什么时候会抛出异常
- 处理许多自定义异常的最佳方法是什么
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- 提出异常并处理C 的某些异常类型的正确方法是什么?
- 如果从在其他函数中调用的函数引发异常会发生什么情况
- 使用一个微不足道的异常类有什么意义
- 在类中抛出异常的最佳方法是什么
- 添加 DIV/0 异常处理。我做错了什么,但无法确定在哪里
- 是什么导致异常输出以及如何修复
- 与Java的InputMismatchException和IOException Handling等效的C++异常处理机制是什么
- 在 c++ 中什么可以(和什么不能)引发异常?
- 在C++中使用异常的可能的错误处理策略是什么,它们的后果和影响是什么
- close()抛出什么异常类型