QtWebkit:如何从Qt向JavaScript上下文发送异常?

时间:2011-06-16 12:44:35

标签: qt webkit qtwebkit

我有一个简单的Qt 4.7应用程序,它使用QtWebKit显示HTML / JavaScript页面。使用addToJavaScriptWindowObject()向JavaScript环境提供了一些C ++函数。

在从JavaScript调用此类函数的某些情况下,有没有办法在JavaScript上下文中引发异常

  • 抛出C ++异常,例如throw 123;,只会导致Qt应用程序崩溃
  • 使用evaluateJavaScript("throw new Error('whatever');")我可以抛出异常,但显然它没有被传递给调用JavaScript上下文(即只有eval()代码本身被中止)

查看源代码我看到类似setException()和类似的方法,但显然我需要一个JSContext或其他对调用JavaScript上下文的引用,但我不知道如何获取它(没有这样的东西在QWebFrame中虽然WebKit本身或QWebFramePrivate似乎有这样的参考。

我的最终目标是 JavaScript 代码,如

try {
  specialBrowserObject.someFunction();
} catch (e) {
  document.write("Exception: "+e.message);
}

显示在C ++中创建的异常(specialBrowserObject是通过addToJavaScriptWindowObject()公开的对象)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,不可能从C ++中抛出异常以便在JavaScript中捕获。我可以建议一些解决方法,但这些可能会或可能不适合您。我意识到这两者都不是你所希望的完美解决方案。

1)使用Q_PROPERTY,以便C ++代码可以设置一个值,如果它想在返回JavaScript时导致异常。 JavaScript必须检查该值以查看从C ++函数返回时是否需要异常,然后手动抛出异常。

2)在我看来,沿着相同的路线,但稍微整洁,将使用一个Q_INVOKABLE函数返回一个QString到您的JavaScript。如果字符串不为空,则从JavaScript中抛出异常。

该函数将在头文件中定义为 -

Q_INVOKABLE QString someFunction( int divisor );

这个函数将是主cpp文件中的这些行 -

QString className::someFunction( int divisor ) {
  // Main body of function doing various things
  ...
  ...
  // Do we need to throw an exception?
  if( divisor == 0 )
    return "Divide by zero";
  ...
  ...
  // Function has succeeded so no need to throw an exception
  return "";
}

JavaScript看起来像这样 -

try {
  retVal = specialBrowserObject.someFunction( divisor );
  if( retVal != "" )
    throw new Error( retVal );
} catch (e) {
  document.write("Exception: "+e.message);
}

我希望这会有所帮助。