Ответ 1
Я думаю, что были проблемы с window.onerror
неправильно работающими в WebKit (https://bugs.webkit.org/show_bug.cgi?id=8519). Не знаю, было ли это исправлено вообще, и если да, то если версия QT WebKit уже обновлена.
Однако вы должны уловить исключения, брошенные в ваш код. Если вы используете что-то вроде webPage.evaluate(...)
для запуска вашего кода, вы не можете завершить полный вызов в блоке try/catch, так как script оценивается в другом контексте, и ошибки не будут отображаться в главном контексте выполнения. Вместо этого вам придется поймать ошибки в контексте выполнения страницы. К сожалению, нет способа доступа к каким-либо функциям, определенным в основном контексте, поэтому мы должны явно написать код обертки вокруг вашего кода, который будет выполнен.
Ниже приведен модифицированный пример файла phantomwebintro.js
, который включен в источник PhantomJS. Он загружает HTML-страницу, вставляет script, а затем запускает некоторый код в контексте страницы (здесь с линией, бросающей ошибку типа). Этот код обернут блоком try/catch и вернет завершенный результат или объект ошибки в основной контекст.
...
// Load an HTML page:
page.open("http://www.phantomjs.org", function(status) {
if (status == "success") {
// Inject some scripts:
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
// Run your own code in the loaded page context:
var resultWrapper = page.evaluate(function() {
var wrapper = {};
try {
// Your code goes here
// ...
var x = undefined.x; // force an error
// store your return values in the wrapper
wrapper.result = 42;
} catch(error) {
wrapper.error = error;
}
return wrapper;
});
// Handle the result and possible errors:
if (resultWrapper.error) {
var error = resultWrapper.error;
console.log("An error occurred: " + error.message);
// continue handling the error
// ...
} else {
var result = resultWrapper.result;
// continue using the returned result
// ...
}
...
});
}
});
...