从屌丝到架构师的飞越(JavaScript篇)-错误处理

一、介绍

这节课呢,我们来了解的是JavaScript 错误处理

在ES3之前js代码执行的过程中,一旦出现错误,整个js代码都会停止执行,这样就显的代码非常的不健壮。

在Java或C#等一些高级语言中,都提供了异常处理机制,可以处理出现的异常,而不会停止整个应用程序。

从ES3开始,js也提供了类似的异常处理机制,从而让js代码变的更健壮,及时执行的过程中出现了异常,也可以让程序具有了一部分的异常恢复能力。

JavaScript提供了一种try catch的错误处理机制,当有错误抛出的时候,可以catch住。与Java的异常机制一样。

try 语句测试代码块的错误。

catch 语句处理错误。

throw 语句创建自定义错误。

JavaScript 错误

当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误。

可能是语法错误,通常是程序员造成的编码错误或错别字。

可能是拼写错误或语言中缺少的功能(可能由于浏览器差异)。

可能是由于来自服务器或用户的错误输出而导致的错误。

当然,也可能是由于许多其他不可预知的因素。

二、知识点介绍

1、Javascript的异常捕获机制

2、throw主动抛出异常

三、上课对应视频的说明文档

1、Javascript的异常捕获机制

1.1 基本的try…catch语句

ES3开始引入了 try-catch 语句,是 JavaScript 中处理异常的标准方式。

语法:

try{

//可能发生异常的代码

}catch(error){

//发生错误执行的代码

}

看下面的代码:

<script>

try{

console.log(b);

console.log("我不会输出的,不要找了")

}catch(error){

console.log("发生错误了")

}

console.log("我try catch后面的代码")

</script>

说明:

把有可能出的问题的代码放在 try 语句中。try语句中可以理论上可以写任何的代码,只要有一行代码出现问题,整个程序的执行流程就会立即调到catch语句中执行。

一旦try中有一行代码发生异常,则这行出错代码的后面的try中的其他语句都不会再执行。比如上面代码中的console.log(b);这行代码会出错,则立即去执行catch中的代码。所以console.log("我不会输出的,不要找了")这行代码则不会再执行

在执行catch中的代码之前,js引擎会首先根据错误类型自动创建一个错误,并通过catch后面的参数传递到catch中。不同的浏览器创建的error对象不一样,但是同创他们都包含一个message属性,值是这个错误的一些信息。

catch中的代码执行完毕之后,会继续执行后面的代码,程序不会停止下来。

1.2 finally语句

在 try…catch 中,try 中一旦出现错误则其他语句不能执行,如果不出现错误则 catch 中的语句不会执行。

Javascript 参考其他编程语言,也提供了一种 finally 语句:不管 try 中的语句有没有错误,在最后都会执行 finally 中的语句。

即:try 中语句不发生错误执行完毕后会执行 finally 中的语句,try 中的语句发生错误,则执行 catch中的语句,catch 中的语句执行完毕后也会执行 finally 中的语句。

语法:

try{

}catch(error){

}finally{

}

<script>

try{

console.log(b);

console.log("我不会输出的,不要找了")

}catch(error){

console.log("发生错误了")

}finally {

console.log("不管发生不发生错误,我都会执行")

}

console.log("我try catch后面的代码")

</script>

所以在 finally 中我们可以放置我们必须要执行的代码。

注意:

在js中,如果添加了 finally 语句,则 catch 语句可以省略。所以下面的代码也是正确的。

如果没有 catch 语句,则一旦发生错误就无法捕获这个错误,所以在执行完 finally 中的语句后,程序就会立即停止了。

所以,在实际使用中,最好一直带着 catch 语句。

<script>

try{

console.log(b);

console.log("我不会输出的,不要找了")

}finally {

console.log("不管发生不发生错误,我都会执行")

}

console.log("我try catch后面的代码")

</script>

1.3 js中的错误类型

执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就 会抛出相应类型的错误对象。js共定义了下列 7 种错误类型:

Error ‰

EvalError

RangeError ‰

ReferenceError ‰

SyntaxError ‰

TypeError ‰

URIError

说明:

Error类型是基本的错误类型,其他类型都继承自这个类型。

EvalError 类型的错误会在使用 eval()函数而发生异常时被抛出

TypeError 类型在 JavaScript 中会经常用到,在变量中保存着意外的类型时,或者在访问不存在的 方法时,都会导致这种错误

一般情况,不同的错误,处理方式不一样。可以参考下面的处理方式。不过在实际开发中,很多程序员并没有形成处理错误的习惯。

try {

someFunction();

} catch (error){

if (error instanceof TypeError){

//处理ૌ类型错误

} else if (error instanceof ReferenceError){

//处理引用错误

} else {

//处理其他的错误

}

}

1.4 合理使用try…catch

当 try-catch 语句中发生错误时,浏览器会认为错误已经被处理了,浏览器就不再报告错误了。这也是最简单的一种情况。

使用 try-catch 最适合处理那些我们无法控制的错误。假设你在使用一个大型 JavaScript 库中的 函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函 数的调用放在 try-catch 语句当中,一有什么错误发生,也好可以恰当地处理它们。

在明明知道自己的代码会发生错误时,再使用 try-catch 语句就不太合适了。例如,如果 传给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定 如何去做。在这种情况下,不应用使用 try-catch 语句。因为try…catch语句比较是比较好资源的事情。

2、throw主动抛出异常

2.1 抛出js内置错误类型的对象

在大部分的代码执行过程中,都是出现错误的时候,由浏览器(javascript引擎)抛出异常,然后程序或者停止执行,或被try…catch 捕获。

然而有时候我们在检测到一些不合理的情况发生的时候也可以主动抛出错误。

使用 throw 关键字抛出来主动抛出异常。

<script>

throw new Error("你好坏");

console.log("执行不到这里的")

</script>

注意:

thow后面就是我们要抛出的异常对象。在以前的时候都是出现错误的时候浏览器抛出异常对象,只是现在是我们自己主动抛出的异常对象。

只要有异常对象抛出,不管是浏览器抛出的,还是代码主动抛出,都会让程序停止执行。如果想让程序继续执行,则有也可以用try…catch来捕获。

每一个错误类型都可以传入一个参数,表示实际的错误信息。

我们可以在适当的时候抛出任何我们想抛出的异常类型。throw new SyntaxError("语法错误...");

看下面的代码:

<script>

/*该函数接收一个数字,返回他的平方。*/

function foo(num) {

if(typeof num == "number"){

return num * num;

}else{

throw new TypeError("类型错误,你应该传入一个数字...")

}

}

console.log(foo(33))

console.log(foo("abc"))

</script>

2.2 抛出自定义类型的错误对象

我们不仅仅可以抛出js内置的错误类型的对象,也可以自定义错误类型,然后抛出自定义错误类型的对象。

如果要自定义错误类型,只需要继承任何一个自定义错误类型都可以。一般直接继承Error即可。

<script>

function MyError(message) {

this.message = "注意:这是自定义的错误"

this.name = "自定义错误";

}

MyError.prototype = new Error();

try {

throw new MyError("注意:这是自定义错误类型")

}catch (error){

console.log(error.message)

}

</script>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  •   由于 JavaScript 本身是动态语言,而且多年来一直没有固定的开发工具,因此人们普遍认为它是一种最难于调...
    霜天晓阅读 757评论 0 1
  • 一.介绍 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序...
    走着别浪阅读 277评论 0 2
  • 八、深入理解java异常处理机制 引子try…catch…finally恐怕是大家再熟悉不过的语句了, 你的答案是...
    壹点零阅读 1,520评论 0 0
  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,682评论 1 56
  • 本章内容:处理错误与调试JavaScript代码 一、错误处理 错误处理在程序设计中的重要性是毋庸置疑的,良好的错...
    了凡和纤风阅读 981评论 0 0