在IE10中已经新加入了Error.stack 的支持,可以加快开发人员的脚本调试,并更正错误 。尤其是一些难以重现的错误,如异步操作等 。以下内容来自于微软IE团队,对于这个特性描述的非常详细 。
调试应用程序JavaScript 中的结构化错误处理依赖于 throw 和 try/catch,开发人员将在其中声明一个错误,并将控制流传递至处理错误的程序的某一部分 。当某一错误被引发时,Chakra,即 Internet Explorer 中的 JavaScript 引擎将捕获引发该错误的调用链,这一过程也被称为调用堆栈 。如果被引发的对象是一个 Error(或者是一个函数,且其原型链将导致 Error),那么 Chakra 将创建一个堆栈跟踪,即可人工读取的调用堆栈列表 。该列表将被表示为一种属性,即 Error 对象中的 stack 。stack 包含错误消息、函数名称和该函数的源文件位置信息 。这些信息将有助于开发人员了解所调用的函数,甚至查看错误的代码行,从而迅速诊断缺陷 。例如,这些信息可能表明传递至函数的某一参数为空,或为无效类型 。
让我们一同来查看一个简单的脚本,并以此展开深入讨论 。该脚本试图计算 (0, 2) 和 (12, 10) 两点间的距离:
复制代码代码如下:
(function () {
’use strict’;
function squareRoot(n) {
if (n0)
throw new Error(’Cannot take square root of negative number.’);
return Math.sqrt(n);
}
function square(n) {
return n * n;
}
function pointDistance(pt1, pt2) {
return squareRoot((pt1.x - pt2.x)(pt1.y - pt2.y));
}
function sample() {
var pt1 = { x: 0, y: 2 };
var pt2 = { x: 12, y: 10 };
console.log(’Distance is: ’pointDistance(pt1, pt2));
}
try {
sample();
}
catch (e) {
console.log(e.stack);
}
})();
该脚本中包含一个缺陷,其未调整组件间的差异 。因此,对于某些输入而言,pointDistance 函数将返回错误的结果;而在其他情况中,该脚本将导致错误发生 。为了理解堆栈跟踪的含义,让我们一同来查看 F12 开发人员工具中的错误,并查看其脚本选项卡:

堆栈跟踪将转储至 catch 子句中的控制台,由于其位于堆栈的顶部,因此起源于 squareRoot 函数的错误将变得显而易见 。为了调试这一问题,开发人员无需深入查看堆栈跟踪;系统已违反 squareRoot 的前置条件,而且只需查看堆栈的上一级,原因将变得十分明了:squareRoot 调用内的子表达式自身应该为 square 的参数 。
调试过程中,stack 属性将有助于识别用于设置断点的代码 。请记住:您还可使用其它方法来查看调用堆栈:例如,如果您将脚本调试程序设置为捕获异常即中断的模式,那么您可使用该调试程序来检查调用堆栈 。对于部署的应用程序,您可考虑在 try/catch 内合并问题代码,以捕获失败的调用,并将其记录于服务器中 。随后,开发人员可查看调用堆栈,以隔离问题区域 。
DOM 异常与 Error.stack此前,我曾注意到被引发的对象必须为 Error 或通过其原型链导致 Error 。这是有意而为之;JavaScript 可支持引发任何对象,甚至包括作为异常的基元 。尽管系统可捕获和检查所有这些对象,但是它们的全部用途并非包含错误或诊断信息 。因此,引发过程中仅将更新错误的 stack 属性 。
即便对象为 DOM 异常,它们也不包含可导致 Error 的原型链,因此它们将不包含 stack 属性 。在某些应用场景中,您需要执行 DOM 操作,并希望暴露 JavaScript 兼容的错误,那么您可能希望在 try/catch 数据块内合并您的 DOM 操作代码,并在 catch 子句中引发一个新的 Error 对象:
复制代码代码如下:
function causesDomError() {
推荐阅读
- 置IE10浏览器临时文件的大小、位置和保存天数的详细方法
- ie10打不开支付宝/淘宝网站解决方案
- IE10浏览器无法记住网站的登陆账号和密码的解决方法
- win8下IE10浏览器权限解锁步骤分享无需使用管理员模式
- Win8自带浏览器IE10中flash无法正常播放的解决方法
- 只需几步就可破除Win8中IE10对Flash网站的限制
- 在win8中找回消失的Metro版IE10的方法
- 将电脑的收藏夹导入至IE10浏览器的方法
- IE10开启InPrivate 隐私浏览模式自动删除上网的蛛丝马迹
- 粗上加粗的IE10字体宽到超出原本的容器
