我有一个简单的Qt 4.7应用程序,它使用QtWebKit显示HTML / JavaScript页面。使用addToJavaScriptWindowObject()
向JavaScript环境提供了一些C ++函数。
在从JavaScript调用此类函数的某些情况下,有没有办法在JavaScript上下文中引发异常?
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()
公开的对象)。
有什么想法吗?
答案 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);
}
我希望这会有所帮助。