下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全面了解javascript中的错误处理机制_ 下面我就为大家带来一篇全面了解javascript中的错误处理机制。我觉得挺不错的,现在就分享给大家,也给大家做个参考。 前面的话 错误处理对于web应用程序开发至关重要,不能提前预报到可能发生的错误,不能提前实行复原策略,可能导致较差的用户体验。由于任何javascript错误都可能导致网页无法用法,因此作为开发人员,必需要知道何时可能出错,为什么会出错,以及会出什么错。本文将具体介绍javascript中的错误处理机制 error对象 error对象是包含错误信息的对象,是javascript的原生对象。当代码解析或运行时发生错误,javas
2、cript引擎就会自动产生并抛出一个error对象的实例,然后整个程序就中断在发生错误的地方 console.log(t);/Uncaught ReferenceError: t is not defined ECMA-262规定了error对象包括两个属性:message和name。message属性保存着错误信息,而name属性保存错误类型 /一般地,用法try-catch语句来捕获错误 try t; catch(ex) console.log(ex.message);/t is not defined console.log();/ReferenceError 扫瞄器还对e
3、rror对象的属性做了扩展,添加了其他相关信息。其中各扫瞄器厂商实现最多的是stack属性,它表示栈跟踪信息(safari不支持) try t; catch(ex) console.log(ex.stack);/file:/D:/wamp/form.html:12:2 当然,可以用法error()构造函数来创建错误对象。假如指定message参数,则该error对象将把它用做它的message属性;若不指定,它将用法一个预定义的默认字符串作为该属性的值 new Error(); new Error(message); /一般地,用法throw语句来抛出错误 throw new Error(te
4、st); /Uncaught Error: test throw new Error();/Uncaught Error function UserError(message) this.message = message; = UserError; UserEtotype = new Error(); UserEtotype.constructor = UserError; throw new UserError(errorMessage);/Uncaught UserError: errorMessage 当不用法new操作符,挺直将Er
5、ror()构造函数像一个函数一样调用时,它的行为和带new操作符调用时一样 Error(); Error(message); throw Error(test);/Uncaught Error: test throw Error();/Uncaught Error error对象有一个toString()方法,返回Error:+ error对象的message属性 var test = new Error(testError); console.log(test.toString();/Error: testError error类型 执行代码期间可能会发生的错误有多种类型。每种错误都有对应的
6、错误类型,而当错误发生时,就会抛出相应类型的错误对象。ECMA-262定义了下列7种错误类型: Error EvalError(eval错误) RangeError(范围错误) ReferenceError(引用错误) SyntaxError(语法错误) TypeError(类型错误) URIError(URI错误) 其中,Error是基类型,其他错误类型都继承自该类型。因此,全部错误类型共享了一组相同的属性。Error类型的错误很少见,假如有也是扫瞄器抛出的;这个基类型的主要目的是供开发人员抛出自定义错误 【EvalError(eval错误)】 eval函数没有被正确执行时,会抛出EvalE
7、rror错误。该错误类型已经不再在ES5中消失了,只是为了保证与以前代码兼容,才连续保留 【RangeError(范围错误)】 RangeError类型的错误会在一个值超出相应范围时触发,主要包括超出数组长度范围以及超出数字取值范围等 new Array(-1);/Uncaught RangeError: Invalid array length new Array(Number.MAX_VALUE);/Uncaught RangeError: Invalid array length (1234).toExponential(21);/Uncaught RangeError: toExpon
8、ential() argument must be between 0 and 20 (1234).toExponential(-1);/Uncaught RangeError: toExponential() argument must be between 0 and 20 【ReferenceError(引用错误)】 引用一个不存在的变量或左值(lvalue)类型错误时,会触发ReferenceError(引用错误) a;/Uncaught ReferenceError: a is not defined 1+;/Uncaught ReferenceError: Invalid left
9、-hand side expression in postfix operation 【SyntaxError(语法错误)】 当不符合语法规章时,会抛出SyntaxError(语法错误) /变量名错误 var 1a;/Uncaught SyntaxError: Unexpected number / 缺少括号 console.log hello);/Uncaught SyntaxError: Unexpected string 【TypeError(类型错误)】 在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致TypeError类型错误。错误的缘由虽然多种多样,但归根结底还是由于
10、在执行特定类型的操作时,变量的类型并不符合要求所致 var o = new 10;/Uncaught TypeError: 10 is not a constructor alert(name in true);/Uncaught TypeError: Cannot use in operator to search for name in true Ftotype.toString.call(name);/Uncaught TypeError: Ftotype.toString is not generic 【URIError(URI错误)】 UR
11、IError是URI相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数 decodeURI(%2);/ URIError: URI malformed error大事 任何没有通过try-catch处理的错误都会触发window对象的error大事 error大事可以接收三个参数:错误消息、错误所在的URL和行号。多数状况下,只有错误消息有用,由于URL只是给出了文档的位置,而行号所指的代码行既可能出自嵌入的JavaScri
12、pt代码,也可能出自外部的文件 要指定onerror大事处理程序,可以用法DOM0级技术,也可以用法DOM2级大事的标准格式 /DOM0级 window.onerror = function(message,url,line) alert(message); /DOM2级 window.addEventListener(error,function(message,url,line) alert(message); ); 扫瞄器是否显示标准的错误消息,取决于onerror的返回值。假如返回值为false,则在掌握台中显示错误消息;假如返回值为true,则不显示 /掌握台显示错误消息 windo
13、w.onerror = function(message,url,line) alert(message); return false; a; /掌握台不显示错误消息 window.onerror = function(message,url,line) alert(message); return true; a; 这个大事处理程序是避开扫瞄器报告错误的最终一道防线。抱负状况下,只要可能就不应当用法它。只要能够适当地用法try-catch语句,就不会有错误交给扫瞄器,也就不会触发error大事 图像也支持error大事。只要图像的src特性中的URL不能返回可以被识别的图像格式,就会触发er
14、ror大事。此时的error大事遵循DOM格式,会返回一个以图像为目标的event对象 加载图像失败时会显示一个警告框。发生error大事时,图像下载过程已经结束,也就是不能再重新下载了 var image = new Image(); image.src = smilex.gif; image.onerror = function(e) console.log(e); throw语句与抛出错误 throw语句用于抛出错误。抛出错误时,必需要给throw语句指定一个值,这个值是什么类型,没有要求 留意抛出错误的过程是堵塞的,后续代码将不会执行 throw 12345; throw hello
15、world; throw true; throw name: javascript; 可以用法throw语句手动抛出一个Error对象 throw new Error(something bad happened); throw new SyntaxError(I dont like your syntax.); throw new TypeError(what type of variable do you take me for?); throw new RangeError(sorry,you just dont have the range.); throw new EvalError
16、(That doesnt evaluate.); throw new URIError(URI, is that you?); throw new ReferenceError(you didnt cite your references properly); 利用原型链还可以通过继承Error来创建自定义错误类型(原型链在第6章中介绍)。此时,需要为新创建的错误类型指定name和message属性 扫瞄器对待继承自Error的自定义错误类型,就像对待其他错误类型一样。假如要捕获自己抛出的错误并且把它与扫瞄器错误区分对待的话,创建自定义错误是很有用的 function CustomError(
17、message) = CustomError; this.message = message; CustomEtotype = new Error(); throw new CustomError(my message); 在遇到throw语句时,代码会立刻停止执行。仅当有try-catch语句捕获到被抛出的值时,代码才会连续执行 更具体的说明为:当抛出特别时,javascript说明器会立刻停止当前正在执行的规律,并跳转到就近的特别处理程序。特别处理程序是用try-catch语句的catch从句编写的。假如抛出特别的代码块没有一条相关联的catch从句,说
18、明器会检查更高层的闭合代码块,看它是否有相关联的特别处理程序。以此类推,直到找到一个特别处理程序为止。假如抛出特别的函数没有处理它的try-catch语句,特别将向上传播到调用该函数的代码。这样的话,特别就会沿着javascript方法的词法结构和调用栈向上传播。假如没有找到任何特别处理程序,javascript将把特别当成程序错误来处理,并报告给用户 try catch语句与捕获错误 ECMA-262第3版引入了try-catch语句,作为JavaScript中处理特别的一种标准方式,用于捕获和处理错误 其中,try从句定义了需要处理的特别所在的代码块。catch从句跟随在try从句之后,当
19、try块内某处发生了特别时,调用catch内的代码规律。catch从句后跟随finally块,后者中放置清理代码,不管try块中是否产生特别,finally块内的规律总是会执行。尽管catch和finally都是可选的,但try从句需要至少二者之一与之组成完整的语句 try/catch/finally语句块都需要用法花括号括起来,这里的花括号是必需的,即使从句中只有一条语句也不能省略花括号 try /通常来讲,这里的代码会从头到尾而不会产生任何问题 /但有时会抛出一个特别,要么是由throw语句挺直抛出,要么通过调用一个方法间接抛出 catch(e) /当且仅当try语句块抛出了特别,才会执行
20、这里的代码 /这里可以通过局部变量e来获得对Error对象或者抛出的其他值的引用 /这里的代码块可以基于某种缘由处理这个特别,也可以忽视这个特别,还可以通过throw语句重新抛出特别 finally /不管try语句是否抛出了特别,finally里的规律总是会执行,终止try语句块的方式有: /1、正常终止,执行完语句块的最终一条语句 /2、通过break、continue或return语句终止 /3、抛出一个特别,特别被catch从句捕获 /4、抛出一个特别,特别未被捕获,连续向上传播 一般地,把全部可能会抛出错误的代码都放在try语句块中,而把那些用于错误处理的代码放在catch块中 假如
21、try块中的任何代码发生了错误,就会立刻退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个错误信息的对象,这个对象中包含的实际信息会因扫瞄器而异,但共同的是有一个保存着错误消息的message属性 留意肯定要给error对象起个名字,置空会报语法错误 try q; catch(error) alert(error.message);/q is not defined /Uncaught SyntaxError: Unexpected token ) try q; catch() alert(error.message); catch接受一个参数,表示try代码块抛出的值
22、 function throwIt(exception) try throw exception; catch (e) console.log(Caught: + e); throwIt(3);/ Caught: 3 throwIt(hello);/ Caught: hello throwIt(new Error(An error happened);/ Caught: Error: An error happened catch代码块捕获错误之后,程序不会中断,会根据正常流程连续执行下去 try throw 出错了; catch (e) console.log(111); console.l
23、og(222); / 111 / 222 为了捕捉不同类型的错误,catch代码块之中可以加入推断语句 try foo.bar(); catch (e) if (e instanceof EvalError) console.log( + : + e.message); else if (e instanceof RangeError) console.log( + : + e.message); / . 虽然finally子句在try-catch语句中是可选的,但finally子句一经用法,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,final
24、ly子句会执行;假如由于出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么代码甚至return语句,都不会阻挡finally子句的执行 /由于没有catch语句块,所以错误没有捕获。执行finally代码块以后,程序就中断在错误抛出的地方 function cleansUp() try throw new Error(出错了); console.log(此行不会执行); finally console.log(完成清理工作); cleansUp(); / 完成清理工作 / Error: 出错了 functio
25、n testFinnally() try return 2; catch(error) return 1; finally return 0; testFinnally();/0 留意return语句的count的值,是在finally代码块运行之前,就猎取完成了 var count = 0; function countUp() try return count; finally count+; countUp();/ 0 console.log(count);/ 1 - function f() try console.log(0); throw bug; catch(e) console
26、.log(1); return true; / 这句原本会延迟到finally代码块结束再执行 console.log(2); / 不会运行 finally console.log(3); return false; / 这句会掩盖掉前面那句return console.log(4); / 不会运行 console.log(5); / 不会运行 var result = f(); / 0 / 1 / 3 console.log(result);/ false 【tips】块级作用域 try-catch语句的一个常见用途是创建块级作用域,其中声明的变量仅仅在catch内部有效 ES6引入了let
27、关键字,为其声明的变量创建块级作用域。但是,在目前ES3和ES5的状况下,经常用法try-catch语句来实现类似的效果 由下面代码可知,e仅存在于catch分句内部,当试图从别处引用它时会抛出错误 try throw new Error();/抛出错误 catch(e) console.log(e);/Error() console.log(e);/Uncaught ReferenceError: e is not defined 常见错误错误处理的核心是首先要知道代码里会发生什么错误。由于javaScript是松散类型的,而且也不会验证函数的参数,因此错误只会在代码期间消失。一般来说,需要
28、关注三种错误:类型转换错误、数据类型错误、通信错误 【类型转换错误】 类型转换错误发生在用法某个操作符,或者用法其他可能自动转换值的数据类型的语言结构时 简单发生类型转换错误的地方是流掌握语句。像if之类的语句在确定下一步操作之前,会自动把任何值转换成布尔值。尤其是if语句,假如用法不当,最简单出错 未用法过的命名变量会自动被给予undefined值。而undefined值可以被转换成布尔值false,因此下面这个函数中的if语句事实上只适用于供应了第三个参数的状况。问题在于,并不是只有undefined才会被转换成false,也不是只有字符串值才可以转换为true。例如,假设第三个参数是数值
29、0,那么if语句的测试就会失败,而对数值1的测试则会通过 function concat(str1,str2,str3) var result = str1 + str2; if(str3) /肯定不要这样 result += str3; return result; 在流掌握语句中用法非布尔值,是极为常见的一个错误来源。为避开此类错误,就要做到在条件比较时切实传入布尔值。事实上,执行某种形式的比较就可以达到这个目的 function concat(str1,str2,str3) var result = str1 + str2; if(typeof str3 = string) /更合适 result += str3; return resu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年员工职业安全培训
- 2026山东青岛澳西智能科技有限公司招聘2人备考题库必考题附答案详解
- 2026重庆永川区中山路街道办事处玉清社区招聘全日制公益性岗位人员1人备考题库及答案详解(历年真题)
- 中建八局西北公司2026届新砼人春季校园招聘备考题库附答案详解(巩固)
- 2026河北邯郸市第一医院医疗健康集团选聘53人备考题库【全优】附答案详解
- 2026云南曲靖市陆良县人力资源和社会保障局招聘公益性岗位3人备考题库【基础题】附答案详解
- 2026江西萍乡市融资担保集团有限公司招聘员工4人备考题库附完整答案详解(名校卷)
- 2026江西新余开物金服科技有限公司招聘备考题库附完整答案详解(典优)
- 2026山东济南市妇女儿童活动中心幼儿园(领秀公馆园)招聘实习生备考题库含答案详解【典型题】
- 2026年学校防坠安全
- 《电力工程 第3版》课件 鞠平 第1-7章 绪论、输电设备-电力系统潮流
- 患者术中体温管理课件
- 【课件】美术的曙光-史前与早期文明的美术+课件-2024-2025学年高中美术人教版(2019)必修美术鉴赏
- 4农业现代化背景下2025年智慧农业大数据平台建设成本分析
- 口腔癌前病变
- 2025年高考数学全国一卷试题真题及答案详解(精校打印)
- GB/T 42230-2022钢板卷道路运输捆绑固定要求
- 2025年上海高考数学二轮复习:热点题型6 数列(九大题型)原卷版+解析
- 浙江金峨生态建设有限公司介绍企业发展分析报告
- 中学语文课程标准与教材研究 第2版 课件全套 第1-6章 语文课程-语文课程资源
- 《生物信息学课件》课件
评论
0/150
提交评论