我在C ++中编写了一个ActiveX控件,当控件中出现错误情况时,它会抛出(C ++)异常。调用表示控件实例的对象的Javascript代码被try-catch块包围:
try
{
var controlInstance = window.controlInstance;
... perform operations on controlInstance ...
}
catch (e)
{
alert("something bad happened");
}
现在,当我在IE8(或7或6)下使用附加的Visual Studio(2008)调试器运行此代码时,一切都按预期工作 - 无论是否使用DEBUG编译控件。但是,在没有附加调试器的情况下运行浏览器时,当异常越过控件和JScript之间的边界时,IE(确实)会崩溃。
有没有人对如何解决这个问题有任何建议?我意识到我可以更改控件的接口以将异常作为参数传回,但我真的不想做出这样的改变。
任何帮助都将不胜感激。
答案 0 :(得分:1)
您无法将C ++异常传递给脚本 - 您需要捕获Invoke()
/ InvokeEx()
中的C ++异常,翻译它们并使用EXCEPINFO*
参数将其传递出去。 / p>
E.g。摘自FireBreath's implementation:
HRESULT YourIDispatchExImpl::InvokeEx(DISPID id, LCID lcid, WORD wFlags,
DISPPARAMS *pdp, VARIANT *pvarRes,
EXCEPINFO *pei, IServiceProvider *pspCaller)
{
try {
// do actual work
} catch (const cppException& e) {
if (pei != NULL) {
pei->bstrSource = CComBSTR(ACTIVEX_PROGID);
pei->bstrDescription = CComBSTR(e.what());
// ...
}
return DISP_E_EXCEPTION;
}
// ...
答案 1 :(得分:1)
您需要AtlReportError。它使用描述字符串抛出javascript异常:
STDMETHODIMP CMyCtrl::MyMethod()
{
...
if (bSucceeded)
return S_OK;
else
// hRes is set to DISP_E_EXCEPTION
return AtlReportError (GetObjectCLSID(), "My error message");
}
答案 2 :(得分:1)
你是如何从C ++传递异常的?如果要将异常传播到javascript,则常规throw
不起作用。您需要抛出COleDispatchException
类型的异常,正确的方法是调用
AfxThrowOleDispatchException(101, _T("Exception Text Here")); // First parameter is exception code.