首页 > 作文

IE10 Error.stack 让脚本调试更加方便快捷

更新时间:2023-04-06 17:44:42 阅读: 评论:0

在ie10中已经新加入了error.stack 的支持,可以加快开发人员的脚本调试,并更正错误。尤其是一些难以重现的错误,如异步大卡车运货2操作等。以景公出游下内容来自于微软ie团队,对于这个特性描述的非常详细。

调试应用程序

javascript 中的结构化错误处理依赖于 throwtry/catch,开发人员将在其中声明一个错误,并将控制流传递至处理错误的程序的某一部分。当某一错误被引发时,chakra,即 internet explorer 中的 javascript 引擎将捕获引发该错误的调用链,这一过程也被称为调用堆栈。如果被引发的对象是一个 error(或者是一个函数,且其原型链将导致 error),那么 chakra 将创建一个堆栈跟踪,即可人工读取的调用堆栈列表。该列表将被表示为一种属性,即 error 对象中的 stackstack 包含错误消息、函数名称和该函数的源文件位置信息。这些信息将有助于开发人员了解所调用的函数,甚至查看错误的代码行,从而迅速诊断缺陷。例如,这些信息可能表明传递至函数的某一参数为空,或为无效类型。

让我们一同来查看一个简单的脚本,并以此展开深入讨论。该脚本试图计算 (0, 2)(12, 10) 两点间的距离:

复制代码 代码如下:

(function () {

‘u strict’;

function squareroot(n) {

if (n < 0)

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 causdomerror() {

try {

var div = document.createelement(‘div’);

div.appendchild(div);

} catch (e) {

throw new error(e.tostring());

}

}

然而,您可能将考虑是否要使用该模式。这可能是最适用于实用工具库开发的模式,特别是在您考虑代码的意图是否为隐藏 dom 操作或简单地实施某一任务的时候。如果其目的为隐藏 dom 操作,那么合并操作并引发
error 可能是我们需要选择的正确方式。

性能注意事项

堆栈跟踪的构造始于错误对象被引发之时;构造堆栈跟踪需要查看当前执行堆栈。为了防止遍历特大堆栈过程中出现性能问题(甚至可能出现的递归堆栈链),默认情况下,ie 仅将收集前十位的堆栈帧。然而该设置可通过将静态属性 error.stacktracelimit 设置为另一数值而得以配置。该设置是全局性的,而且必须在引发错误之前 进行变更,否则其将对堆栈跟踪无效。

异步异常

当某一堆栈是由异步回调(例如 timeoutintervalxmlhttprequest)生成,那么异步回调(而非由异步回调创建的代码)将位于调用堆栈的底部。这将对跟踪有问题的代码产生某些潜在影响:如果您对多个异步回调使用相同的回调函数,那么您将难于通过单独检查而确定是哪一回调产生了错误。让我们对此前的示例稍作修改,我们将避免直接调用 sample(),而是将其放入超时回调:

复制代码 代码如下:

(function () {

‘u strict’;

function squareroot(n) {

if (n < 0)

throw new error(‘cannot take square root of negative number.’);
白骨精见了孙悟空
return math.sqrt(n);

}

function square(n) {

return n * n;

}

functio校运会通讯稿n 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));

}

ttimeout(function () {

try {

sample();

}

catch (e) {

console.log(e.stack);

}

}, 2500);

})();

一旦执行该代码段,您将发现堆栈跟踪将出现稍许延迟。此时,您将同时发现堆栈底部并非全局性代码
,而是
anonymous function。事实上,这并非同一匿名函数,而是传递至
ttimeout 的回调函数。由于您丢失了与挂起回调有关的上下文,因此您可能无法确定调用回调的内容。如果在某一应用场景中,系统注册了某一回调来处理许多不同按钮的
click 事件,那么您将无法分辨注册将引用哪一回调。话虽如此,这一限制作用毕竟有限,因为在大多数情况中,堆栈顶部可能将突出显示问题区域。

观看体验演示

了解 windows 8 consumer preview 中 ie10 的使用情况。您可在 eval 的上下文中执行代码,如果发生错误,您便可检查出该错误。如果您在 ie10 内运行代码,由于您可将错误代码行悬停于堆栈跟踪中,因此您也可突出显示您的代码行。您可自行将代码输入到代码区域,或者从列表中的数个示例中进行选择。此外,全国一卷英语您还可在运行代码示例时设置 error.stacktracelimit 值。

如欲查看参考材料,请浏览有关 error.stackstacktracelimit 的 msdn 文档。

本文发布于:2023-04-06 17:44:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/716180789ed901ba17f82c1370ea2841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:IE10 Error.stack 让脚本调试更加方便快捷.doc

本文 PDF 下载地址:IE10 Error.stack 让脚本调试更加方便快捷.pdf

上一篇:梦见发小结婚
下一篇:返回列表
标签:堆栈   代码   错误   回调
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图