我有一个PhantomJS脚本,它加载一个本地HTML文件,注入一些javascript文件,然后在页面上下文中执行一些javascript。运行的javascript会生成异常,但我只从控制台获取输出,这似乎不区分错误和普通日志,并且没有文件,行号或堆栈跟踪。
我需要的是捕获或以其他方式区分这些错误的方法。我已经尝试过了:
window.onerror
函数
我希望能够检索错误对象本身,以便我可以检索堆栈跟踪。
答案 0 :(得分:8)
我认为window.onerror
在WebKit中没有正常工作存在问题(https://bugs.webkit.org/show_bug.cgi?id=8519)。不知道这是否已经修复,如果是,如果QT WebKit版本已经是最新的。
但是,您应该能够捕获代码中抛出的异常。如果使用webPage.evaluate(...)
之类的东西来运行代码,则无法将整个调用封装在try / catch块中,因为脚本是在不同的上下文中计算的,并且错误不会出现在主执行上下文中。相反,您需要捕获页面执行上下文中的错误。遗憾的是,无法访问主上下文中定义的任何函数,因此我们必须在您的代码周围显式编写包装代码以进行执行。
以下是PhantomJS源中包含的phantomwebintro.js
文件的修改示例。它加载一个HTML页面,插入一个脚本然后在页面上下文中运行一些代码(这里有一行抛出一个类型错误)。此代码包含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
// ...
}
...
});
}
});
...
答案 1 :(得分:2)
解决方案? return true
!
// Error tracking
page.onError = function(msg, trace) {
console.log('= onError()');
var msgStack = [' ERROR: ' + msg];
if (trace) {
msgStack.push(' TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
});
}
console.log(msgStack.join('\n'));
// Consider error fully handled
return true;
};