iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >IE10 Error.stack脚本调试的方法
  • 558
分享到

IE10 Error.stack脚本调试的方法

2024-04-02 19:04:59 558人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“IE10 Error.stack脚本调试的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“IE10 Error.stack脚本调试的方法”文章能帮助大家解决疑惑,下面跟着小编的思

本文小编为大家详细介绍“IE10 Error.stack脚本调试的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“IE10 Error.stack脚本调试的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

调试应用程序

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 (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 开发人员工具中的错误,并查看其脚本选项卡:

屏幕截图中的 F12 开发人员工具显示了一个由调用 console.log(e.stack) 记录的堆栈跟踪,其中 e 是传递至 try/catch 数据块中 catch 子句的错误对象。

堆栈跟踪将转储至 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() {

try {

var div = document.createElement('div');

div.appendChild(div);

} catch (e) {

throw new Error(e.toString());

}

}

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

性能注意事项

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

异步异常

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

})();

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

读到这里,这篇“IE10 Error.stack脚本调试的方法”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网JavaScript频道。

--结束END--

本文标题: IE10 Error.stack脚本调试的方法

本文链接: https://www.lsjlt.com/news/95999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • IE10 Error.stack脚本调试的方法
    本文小编为大家详细介绍“IE10 Error.stack脚本调试的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“IE10 Error.stack脚本调试的方法”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2024-04-02
  • 如何理解IE10 Error.stack让脚本调试更加方便快捷
    本篇文章为大家展示了如何理解IE10 Error.stack让脚本调试更加方便快捷,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。&nb...
    99+
    2024-04-02
  • Pig中调试脚本的方法是什么
    在Pig中调试脚本的方法有以下几种: 使用DESCRIBE命令查看数据表的结构和模式,确保输入数据和预期的一致。 使用DUMP命令...
    99+
    2024-04-02
  • 有哪些Bash脚本内置的调试方法
    本篇内容介绍了“有哪些Bash脚本内置的调试方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用 Bash 写的脚本也可以进行调试,和 Py...
    99+
    2023-06-09
  • Linux Shell脚本调试模式的方法有哪些
    这篇文章主要介绍“Linux Shell脚本调试模式的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux Shell脚本调试模式的方法有哪些”文章能帮助大家解决问题。如何开始写一个脚...
    99+
    2023-06-27
  • java中调用shell脚本的方法
    java中调用shell脚本的方法:1、在java项目中能够通过ProcessBuilder进行调度shell脚本,参数设置相对简单;2、还能够通过系统Runtime执行shell脚本,但在参数设置上需要添加空格将两个参数分开。具体内容如下...
    99+
    2024-04-02
  • 怎么调试Linux shell脚本
    这篇文章主要介绍“怎么调试Linux shell脚本”,在日常操作中,相信很多人在怎么调试Linux shell脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么调试Linux shell脚本”的疑惑有所...
    99+
    2023-06-09
  • 如何调试 PHP CLI 脚本
    如何调试 php cli 脚本?使用 var_dump() 函数显示变量内容和类型。设置 display_errors 和 log_errors 以显示错误并在错误日志中记录。安装和配置...
    99+
    2024-05-12
    php cli
  • PHP Linux脚本调试技巧:解决常见问题的方法
    引言:在开发和维护PHP脚本时,我们经常会遇到各种各样的问题。调试是解决这些问题的关键步骤之一。本文将介绍一些在Linux环境下调试PHP脚本的常见问题和解决方法,并提供具体的代码示例。一、使用echo和var_dump输出变量值在调试PH...
    99+
    2023-10-21
    linux脚本 PHP调试 常见问题解决
  • 怎么调试Apache Pig脚本
    调试Apache Pig脚本可以通过以下几种方式: 使用grunt shell:在运行Pig脚本之前,可以先进入Pig的交互式s...
    99+
    2024-04-02
  • python中如何调试脚本
    小编给大家分享一下python中如何调试脚本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!调试脚本我们可以在 模块的帮助下在 Python 脚本中设置断点。请按照...
    99+
    2023-06-27
  • python调用bash shell脚本方法
    目录1. os.system()1.1. demo2. os.popen()2.1 demo3. commands模块4. subprocess4.1 demo1. os.syste...
    99+
    2024-04-02
  • nginx调用shell脚本的方法是什么
    在 Nginx 中调用 shell 脚本有多种方法,以下是其中的一些常用方法:1. 使用 Nginx 的 `ngx_http_she...
    99+
    2023-09-22
    nginx shell
  • golang调用shell脚本的方法是什么
    在Go语言中,可以使用os/exec包来调用shell脚本。 下面是一个示例代码: package main import ( ...
    99+
    2024-02-29
    golang shell
  • 如何实现Linux Shell脚本调试
    这篇文章主要讲解了“如何实现Linux Shell脚本调试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现Linux Shell脚本调试”吧!一、调试脚本调试功能是每一种编程语言都应该...
    99+
    2023-06-09
  • python调用bash shell脚本的方法是什么
    本篇文章为大家展示了python调用bash shell脚本的方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. os.system()help(os.system)1.1. d...
    99+
    2023-06-22
  • 通过Jython调用Python脚本的实现方法
    前言 前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jython.jar 的插件. Jython 是 ...
    99+
    2024-04-02
  • JavaScript调试的方法
    这篇文章主要介绍“JavaScript调试的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript调试的方法”文章能帮助大家解决问题。  ...
    99+
    2024-04-02
  • RocketMQ源码本地搭建调试方法
    目录1 GitHub源码2 启动Namesrv3 启动Broker4 启动Producer5 启动Consumer6 总结1 GitHub源码 git clone https://g...
    99+
    2023-01-28
    RocketMQ源码本地搭建调试 RocketMQ源码 RocketMQ源码调试
  • 怎么用内置变量调试shell脚本
    本篇内容主要讲解“怎么用内置变量调试shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用内置变量调试shell脚本”吧!一般的shell脚本的调试基本都是echo 来处理遇到比较大...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作