捕获从用C ++编写的ActiveX控件抛出的Javascript中的异常

时间:2010-09-24 23:15:41

标签: c++ exception activex javascript

我在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(确实)会崩溃。

有没有人对如何解决这个问题有任何建议?我意识到我可以更改控件的接口以将异常作为参数传回,但我真的不想做出这样的改变。

任何帮助都将不胜感激。

3 个答案:

答案 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. 

参考:http://doc.sumy.ua/prog/active_x/ch03.htm#Heading20