如何从将触发脚本异常处理程序的C++引发异常
How to raise an exception from C++ that will trigger scripting exception handlers
我一直在网上找到这个答案的零碎部分,但不是一个清晰的解决方案。
这就是我要做的。1) 创建一个 ATL 简单对象。2) 向该对象添加一个返回布尔值而不是 HRESULT 的方法。 调用方需要真/假返回值。3) 向 jscript 或 vbscript 调用方抛出异常,该调用方将提供 e.description 和 e.number 数据。
RE 2)我发现我可以使用 STDMETHODIMP_(BOOL) 和 [local] 来允许返回 BOOL RE 3)我发现我可以通过 SetErrorInfo() 传递 IErrorInfo 来填充 Error 对象
我的困境是我无法弄清楚如何构建C++以跨 ABI 边界抛出一个不会使调用者崩溃的异常。
为脚本客户端编写代码时,必须使用名为自动化的 COM 子集。 这决定了:
- 所有接口都必须派生自 IDispatch
- 一个 Coclass 应该只实现一个源接口
- 所有方法都必须返回 HRESULT,只有 STDMETHODIMP 有效
- 参数类型必须限制为自动化允许的子集。
特别是这意味着不允许使用BOOL,必须VARIANT_BOOL。 通过在 IDL 中像这样编写布尔值来声明一个返回布尔值的方法:
[id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);
在代码中将VARIANT_TRUE或VARIANT_FALSE分配给 *retval。 脚本语言使用自然语法,如var = Foo()
。
通过返回失败 HRESULT,在脚本客户端中生成异常。
你可以通过以下方式使客户端处理"异常"
- 像你说的那样设置 IErrorInfo
- 返回非 HRESULT HR != S_OK
因此,您需要 IDispatch/Interop 兼容接口,这些接口需要 HRESULT 返回类型 (AFAIR)。
IDL 允许更多,但脚本主机(VBS、JScript、VBA 等)等"动态"客户端不会在本地使用这些客户端,因此互操作性不会是最佳的。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常