我很难理解PhantomJS如何处理错误.
我有一个本地安装的Apache服务器运行(xampp),当我手动访问“http://localhost/”,我得到“它的工作!页.
作为一个测试,我写了一个小文件(称为forceError.js),故意导致未检查的异常:
var page = require('webpage').create(),url = 'http://localhost/'; page.onError = function(msg,trace) { console.log("page.onError"); var msgStack = ['ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function(t) { msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : '')); }); } console.error(msgStack.join('\n')); }; phantom.onError = function(msg,trace) { console.log("phantom.onError"); var msgStack = ['PHANTOM ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function(t) { msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : '')); }); } console.error(msgStack.join('\n')); phantom.exit(1); }; page.open(url,function (status) { console.log("status: " + status); // an undefined function thisShouldForceAnError(); });
当我运行这个使用:
phantomjs.exe forceError.js
首先我得到“状态:成功”,然后进程挂起.我没有看到任何一个page.onError或phantom.onError被调用.
我在Windows 7,PhantomJS版本2.0.0,并运行在我的“git bash”shell.
解决方法
在MacOS上测试并且经历了完全相同的行为,这确实有点不直观,很可能只是一个错误.奇怪的是,如果从最大范围的phantom.onError调用一个未定义的函数正确调用1.
作为一种解决方法,您可以使用try / catch来打包回调的正文.希望它会做这个工作.
只是为了澄清:如果在执行请求页面的代码时发生错误(而不是幻像脚本本身),则调用page.onError.
我一直依靠page.onError一段时间,似乎工作相当稳定. (虽然有些错误只发生在phantomjs引擎中,但不在普通浏览器中.)
1实际上:“phantom.onError”无限制地打印在控制台上,因为phantomjs不支持console.error.