• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
掌柜able 显示全部楼层 发表于 2021-10-25 20:08:42 |阅读模式 打印 上一主题 下一主题
在IE10中已经新加入了Error.stack 的支持,可以加快开发职员的脚本调试,并更正错误。尤其是一些难以重现的错误,如异步操作等。以下内容来自于微软IE团队,对于这个特性形貌的非常具体。
调试应用步调JavaScript 中的结构化错误处置处罚依赖于
  1. throw
复制代码
  1. try/catch
复制代码
,开发职员将在其中声明一个错误,并将控制流畅报至处置处罚错误的步调的某一部门。当某一错误被引发时,Chakra,即 Internet Explorer 中的 JavaScript 引擎将捕获引发该错误的调用链,这一过程也被称为调用堆栈。如果被引发的对象是一个
  1. Error
复制代码
(大概是一个函数,且其原型链将导致
  1. Error
复制代码
),那么 Chakra 将创建一个堆栈跟踪,即可人工读取的调用堆栈列表。该列表将被表现为一种属性,即
  1. Error
复制代码
对象中的
  1. stack
复制代码
  1. stack
复制代码
包罗错误消息、函数名称和该函数的源文件位置信息。这些信息将有助于开发职员相识所调用的函数,乃至查看错误的代码行,从而迅速诊断缺陷。例如,这些信息大概表明通报至函数的某一参数为空,或为无效范例。
让我们一同来查看一个简朴的脚本,并以此睁开深入讨论。该脚本试图盘算
  1. (0, 2)
复制代码
  1. (12, 10)
复制代码
两点间的隔断:

复制代码代码如下:
(function () {
'use 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);
}
})();

该脚本中包罗一个缺陷,其未调解组件间的差别。因此,对于某些输入而言,
  1. pointDistance
复制代码
函数将返回错误的结果;而在其他环境中,该脚本将导致错误发生。为了明白堆栈跟踪的含义,让我们一同来查看 F12 开发职员工具中的错误,并查看其脚本选项卡:

堆栈跟踪将转储至
  1. catch
复制代码
子句中的控制台,由于其位于堆栈的顶部,因此劈头于
  1. squareRoot
复制代码
函数的错误将变得显而易见。为了调试这一问题,开发职员无需深入查看堆栈跟踪;体系已违反
  1. squareRoot
复制代码
的前置条件,而且只需查看堆栈的上一级,缘故起因将变得非常明了:
  1. squareRoot
复制代码
调用内的子表达式自身应该为
  1. square
复制代码
的参数。
调试过程中,
  1. stack
复制代码
属性将有助于识别用于设置断点的代码。请记着:您还可利用别的方法来查看调用堆栈:例如,如果您将脚本调试步调设置为“捕获非常即停止”的模式,那么您可利用该调试步调来查抄调用堆栈。对于摆设的应用步调,您可思量在
  1. try/catch
复制代码
内合并问题代码,以捕获失败的调用,并将其纪录于服务器中。随后,开发职员可查看调用堆栈,以隔离问题地域。
DOM 非常与 Error.stack此前,我曾注意到被引发的对象必须为
  1. Error
复制代码
或通过其原型链导致
  1. Error
复制代码
。这是故意而为之;JavaScript 可支持引发任何对象,乃至包括作为非常的基元。尽管体系可捕获和查抄所有这些对象,但是它们的全部用途并非包罗错误或诊断信息。因此,引发过程中仅将更新错误的
  1. stack
复制代码
属性。
即便对象为 DOM 非常,它们也不包罗可导致
  1. Error
复制代码
的原型链,因此它们将不包罗
  1. stack
复制代码
属性。在某些应用场景中,您需要执行 DOM 操作,并盼望袒露 JavaScript 兼容的错误,那么您大概盼望在
  1. try/catch
复制代码
数据块内合并您的 DOM 操作代码,并在
  1. catch
复制代码
子句中引发一个新的
  1. Error
复制代码
对象:

复制代码代码如下:
function causesDomError() {
try {
var div = document.createElement('div');
div.appendChild(div);
} catch (e) {
throw new Error(e.toString());
}
}

然而,您大概将思量是否要利用该模式。这大概是最实用于实用工具库开发的模式,特别是在您思量代码的意图是否为隐藏 DOM 操作或简朴地实行某一使命的时候。如果其目的为隐藏 DOM 操作,那么合并操作并引发
  1. Error
复制代码
大概是我们需要选择的精确方式。
性能注意事项堆栈跟踪的构造始于错误对象被引发之时;构造堆栈跟踪需要查看当前执行堆栈。为了防止遍历特大堆栈过程中出现性能问题(乃至大概出现的递归堆栈链),默认环境下,IE 仅将网络前十位的堆栈帧。然而该设置可通过将静态属性
  1. Error.stackTraceLimit
复制代码
设置为另一数值而得以设置。该设置是全局性的,而且必须在引发错误之前 举行变动,否则其将对堆栈跟踪无效。
异步非常当某一堆栈是由异步回调(例如
  1. timeout
复制代码
  1. interval
复制代码
  1. XMLHttpRequest
复制代码
)生成,那么异步回调(而非由异步回调创建的代码)将位于调用堆栈的底部。这将对跟踪有问题的代码产生某些潜在影响:如果您对多个异步回调利用雷同的回调函数,那么您将难于通过单独查抄而确定是哪一回调产生了错误。让我们对此前的示例稍作修改,我们将避免直接调用
  1. sample()
复制代码
,而是将其放入超时回调:

复制代码代码如下:
(function () {
'use 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));
}
setTimeout(function () {
try {
sample();
}
catch (e) {
console.log(e.stack);
}
}, 2500);
})();

一旦执行该代码段,您将发现堆栈跟踪将出现稍许耽误。此时,您将同时发现堆栈底部并非全局性代码
  1. [/code],而是[code]Anonymous function
复制代码
。事实上,这并非同一匿名函数,而是通报至
  1. setTimeout
复制代码
的回调函数。由于您丢失了与挂起回调有关的上下文,因此您大概无法确定调用回调的内容。如果在某一应用场景中,体系注册了某一回调来处置处罚许多不同按钮的
  1. click
复制代码
变乱,那么您将无法分辨注册将引用哪一回调。话虽如此,这一限制作用究竟有限,由于在大多数环境中,堆栈顶部大概将突出体现问题地域。
观看体验演示

相识 Windows 8 Consumer Preview 中 IE10 的利用环境。您可在
  1. eval
复制代码
的上下文中执行代码,如果发生错误,您便可查抄出该错误。如果您在 IE10 内运行代码,由于您可将错误代码行悬停于堆栈跟踪中,因此您也可突出体现您的代码行。您可自行将代码输入到代码地域,大概从列表中的数个示例中举行选择。别的,您还可在运行代码示例时设置
  1. Error.stackTraceLimit
复制代码
值。
如欲查看参考材料,请欣赏有关
  1. Error.stack
复制代码
  1. stackTraceLimit
复制代码
的 MSDN 文档。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作