QtWebkit: как отправить исключение из Qt в контекст JavaScript? - PullRequest
1 голос
/ 16 июня 2011

У меня есть простое приложение 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 голосов
/ 22 июня 2011

Насколько я могу судить, невозможно выдать исключение из 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);
}

Надеюсь, это поможет.

...