热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

毛病检测(1)trycatch语句From《高程3》

0媒介现在读到了《高程3》的毛病检测部份,现在先挖一个坑,关于毛病检测应当写三篇总结:firebug检测毛病和输出信息;try-catch毛病捕捉;罕见毛病品种。本篇逻辑思绪以下:

0 媒介

现在读到了《高程3》的毛病检测部份,现在先挖一个坑,关于毛病检测应当写三篇总结:firebug检测毛病和输出信息;try-catch毛病捕捉;罕见毛病品种。

本篇逻辑思绪以下:起首引见举行毛病捕捉的try-catch语句;然后引见罕见的毛病范例,这点会连系firebug来申明;其次引见try-catch语句和毛病范例连系运用以捕捉毛病;然则假如捕捉的毛病以浏览器的言语示意,照样很难找到毛病,因此引荐运用throw抛出开发者自定义的毛病,如许,毛病的位置和缘由就会更轻易发明;末了就毛病抛出和毛病捕捉举行了总结议论。

1 try-catch简介

优越的毛病处置惩罚机制可以让用户和开发者实时获得提示,晓得究竟发作了什么事,因此不会手足无措。ECMA-262 第 3 版引入了 try-catch 语句,作为 Javascript 中处置惩罚异常的一种规范体式格局。基础的语法以下所示,

try{
// 能够会致使毛病的代码
} catch(error){
// 在毛病发作时怎样处置惩罚
}

我们应当把一切能够会抛出毛病的代码都放在 try 语句块中,而把那些用于毛病处置惩罚的代码放在 catch 块中。假如 try 块中的任何代码发作了毛病,就会马上退出代码实行历程,然后接着实行 catch 块。此时, catch 块会吸收到一个包括毛病信息的对象。纵然你不想运用这个毛病对象,也要指定一个参数名。这个对象中包括的现实信息会因浏览器而异,但配合的是有一个保存着毛病音讯的 message 属性。这个 message 属性是唯一一个可以保证一切浏览器都支撑的属性,除此以外, IE、 Firefox、 Safari、 Chrome 以及 Opera 都为毛病对象增加了其他相干信息。在跨浏览器编程时,最好照样只运用 message 属性。
一个测试例子:
《毛病检测(1)------try-catch语句 From 《高程3》》

只需代码中包括 finally 子句,则不管 try 或 catch 语句块中包括什么代码——以至 return 语句,都不会阻挠 finally 子句的实行。以下例所示:

function testFinally() {
try {
return 2;
} catch (error) {
return 1;
} finally {
return 0;
}
}
function testWithoutFinally() {
try {
return 2;
} catch (error) {
return 1;
}
}
console.log(testFinally());//输出0
console.log(testWithoutFinally());//输出2

假如供应 finally 子句,则 catch 子句就成了可选的(catch 或 finally 有一个即可)。 IE7 及更早版本中有一个 bug:除非有 catch 子句,不然 finally 中的代码永久不会实行。IE8 修复了这个 bug。假如你依然要斟酌 IE 的初期版本,那就只好供应一个 catch 子句,哪怕内里什么都不写。

另一个测试实例:

var example = function() {
try {
window.someNonexistentFunction();
} catch (error) {
console.log(error.name);
console.log(error.message);
return 1;
} finally {
console.log('everything is over');
}
};
example();

测试效果:前后实行了try/catch/finally中的语句,题目是为何会在末了实行一次catch中的return语句?留给本身一个题目吧。
《毛病检测(1)------try-catch语句 From 《高程3》》

2 毛病范例

每种毛病都有对应的毛病范例,而当毛病发作时,就会抛出响应范例的毛病对象(error object)。ECMA-262 定义了以下 7 种毛病范例:

1) Error 是基范例,其他毛病范例都继承自该范例。因此,一切毛病范例同享了一组雷同的属性(毛病对象中的要领满是默许的对象要领)。
2)EvalError 范例的毛病会在运用 eval()函数而发作异常时被抛出,然则抛出的毛病不一定是EvalError 范例。假如没有把 eval()当做函数挪用,Firefox 4+和 IE8 对此抛出 TypeError。

3)RangeError 范例的毛病会在数值超越响应局限时触发。比方,在定义数组时,假如指定了数组不支撑的项数(如-20 或 Number.MAX_VALUE),就会触发这类毛病。

4)在找不到对象的状况下,会发作 ReferenceError(这类状况下,会直接致使人所共知的”object expected”浏览器毛病)。一般,在接见不存在的变量时,就会发作这类毛病。

5) 至于 SyntaxError,当我们把语法毛病的 Javascript 字符串传入 eval()函数时,就会致使此类毛病。假如语法毛病的代码涌现在 eval()函数以外,则不太能够运用 SyntaxError,因为此时的语法毛病会致使 Javascript 代码马上住手实行。

6)TypeError 范例在 Javascript 中会常常用到,在变量中保存着不测的范例时,或许在接见不存在的要领时,都邑致使这类毛病。毛病的缘由虽然多种多样,但归根结柢照样因为在实行特定于范例的操纵时,变量的范例并不符合请求而至。最常发作范例毛病的状况,就是传递给函数的参数事前未经搜检,效果传入范例与预期范例不符合。

7) 在运用 encodeURI()或 decodeURI(),而 URI 花样不正确时,就会致使 URIError 毛病。这类毛病也很少见,因为前面说的这两个函数的容错性异常高。

上述测试历程在FF以下:

《毛病检测(1)------try-catch语句 From 《高程3》》

3 运用try-catch语句捕捉毛病

要想晓得毛病的范例,可以像下面如许在 try-catch 语句的 catch 语句中运用 instanceof 操纵符。

try {
someFunction();
} catch (error){
if (error instanceof TypeError){
//处置惩罚范例毛病
} else if (error instanceof ReferenceError){
//处置惩罚援用毛病
} else {
//处置惩罚其他范例的毛病
}
}

在跨浏览器编程中,搜检毛病范例是肯定处置惩罚体式格局的最轻便门路;而包括在 message 属性中的毛病音讯会因浏览器而异。
运用 try-catch 最适合处置惩罚那些我们无法控制的毛病。假定你在运用一个大型 Javascript 库中的函数,该函数能够会有意无意地抛出一些毛病。因为我们不能修正这个库的源代码,所以大可将对该函数的挪用放在 try-catch 语句当中,万一有什么毛病发作,也好适当地处置惩罚它们。

4 throw抛出自定义毛病

与 try-catch 语句相配的另有一个 throw 操纵符,用于随时抛出自定义毛病。抛出毛病时,必需要给 throw 操纵符指定一个值,这个值是什么范例,没有请求。在碰到 throw 操纵符时,代码会马上住手实行。仅当有 try-catch 语句捕捉到被抛出的值时,代码才会继承实行。

经由过程运用自定义的内置毛病范例,可以更真实地模仿浏览器毛病。每种毛病范例的组织函数吸收一个参数,即现实的毛病音讯。下面是例子。

throw new Error("Something bad happened.");
throw new SyntaxError("I don’t like your syntax.");
throw new TypeError("What type of variable do you take me for?");
throw new RangeError("Sorry, you just don’t have the range.");
throw new EvalError("That doesn’t evaluate.");
throw new URIError("Uri, is that you?");
throw new ReferenceError("You didn’t cite your references properly.");

浏览器会像处置惩罚本身天生的毛病一样,来处置惩罚这些代码抛出的毛病。换句话说,浏览器会以通例体式格局报告这一毛病,并且会显现这里的自定义毛病音讯。

抛出自定义毛病的意义:轻易疾速定位毛病并纠错。虽然浏览器会本身报错,然则这些报错信息在浏览器中达不到一致,而且假如涌现同品种型毛病,查找泉源是庞杂的,尤其是在数千行代码中。然则假如你晓得能够的代码毛病,可以直接在代码中增加这些自定义的毛病,一旦发作这些毛病,浏览器就报出自定义毛病,关键是这个毛病的位置和范例不言而喻。
实例:一个必需吸收数组作为参数的函数假如吸收字符串作为参数就会报错。

function process(values){
values.sort();
for (var i=0, len=values.length; i if (values[i] > 100){
return values[i];
}
}
return -1;
}
var a = process("string");
console.log(a);

firebug中效果:
《毛病检测(1)------try-catch语句 From 《高程3》》
增加自定义毛病后的代码:

function process(values){
if (!(values instanceof Array)){
throw new Error("process(): Argument must be an array.");
}
values.sort();
for (var i=0, len=values.length; i if (values[i] > 100){
return values[i];
}
}
return -1;
}
var a = process("string");
console.log(a);

firebug中效果:
《毛病检测(1)------try-catch语句 From 《高程3》》

假如 values 参数不是数组,就会抛出一个毛病。毛病音讯中包括了函数的称号,以及为何会发作毛病的明白形貌。假如一个庞杂的 Web 应用程序发作了这个毛病,那末查找题目标泉源也就轻易多了。

应用原型链还可以经由过程继承 Error 来建立自定义毛病范例。此时,需要为新建立的毛病范例指定 name 和 message 属性。
一个实例:

//经由过程继承Error完成自定义毛病范例,要定义name和message属性
function CustomError(message){
this.name = "CustomError";
this.message = message;
}
CustomError.prototype = new Error();
function process(values){
//假如涌现毛病,就抛出自定义毛病范例的对象实例
if (!(values instanceof Array)){
throw new CustomError("process(): Argument must be an array.");
}
values.sort();
for (var i=0, len=values.length; i if (values[i] > 100){
return values[i];
}
}
return -1;
}
process("string");

firebug显现自定义范例的毛病:

《毛病检测(1)------try-catch语句 From 《高程3》》

5 抛出毛病与运用 try-catch捕捉毛病

关于什么时候该抛出毛病,而什么时候该运用 try-catch 来捕捉它们,是一个陈词滥调的题目。一般来说,应用程序架构的较低条理中常常会抛出毛病,但这个条理并不会影响当前实行的代码,因此毛病一般得不到真正的处置惩罚。假如你盘算编写一个要在许多应用程序中运用的 Javascript 库,以至只编写一个能够会在应用程序内部多个处所运用的辅佐函数,我都强烈建议你在抛出毛病时供应详实的信息。然后,即可在应用程序中捕捉并适当地处置惩罚这些毛病。
说到抛出毛病与捕捉毛病,我们以为只应当捕捉那些你确实地晓得该怎样处置惩罚的毛病。捕捉毛病的目标在于防止浏览器以默许体式格局处置惩罚它们;而抛出毛病的目标在于供应毛病发作详细缘由的音讯。


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 深入解析JavaScript柯里化的实现机制及其应用场景
    本文深入探讨了JavaScript中柯里化的实现机制及其应用场景。通过详细的示例代码,文章全面解析了柯里化的工作原理和实际应用,为读者提供了宝贵的学习资源,有助于提升编程技能和解决实际开发中的问题。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 如何撰写初级和高级前端开发者的专业简历
    如何撰写初级和高级前端开发者的专业简历 ... [详细]
  • 本文详细探讨了JavaScript中数组去重的各种方法,并通过实际代码示例进行了深入解析。文章首先介绍了几种常见的去重技术,包括使用Set对象、过滤方法和双重循环等。每种方法都附有具体的实现代码,帮助读者更好地理解和应用这些技术。此外,文中还讨论了不同方法在性能上的优劣,为开发者提供了实用的参考。 ... [详细]
author-avatar
可爱的你公馆_698
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有