原創(chuàng)聲明
本文系作者辛苦碼字所得,歡迎分享和轉(zhuǎn)載,但請(qǐng)?jiān)诿黠@位置注明作者的如下信息:
筆名:來碗雞蛋面
簡(jiǎn)書主頁:http://www.reibang.com/u/4876275b5a73
郵箱:job_tom@foxmail.com
CSDN ID:tom_wong666
版權(quán)說明:
本文參考了《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》第17章 ‘錯(cuò)誤處理與調(diào)試’ 的相關(guān)內(nèi)容吗氏,并在其基礎(chǔ)上做了拓展,如有侵權(quán)請(qǐng)版權(quán)方聯(lián)系博主刪除术浪。
博主聯(lián)系方式:job_tom@foxmail.com
問題:
捕獲錯(cuò)誤和拋出錯(cuò)誤的時(shí)機(jī)是什么虹菲?
分析:
捕獲錯(cuò)誤和拋出錯(cuò)誤的時(shí)機(jī):應(yīng)該捕獲那些你確切地知道該如何處理的錯(cuò)誤,捕獲錯(cuò)誤的目的在于避免瀏覽器以默認(rèn)方式處理它們(比如不友好的提醒萌衬、代碼終止丧诺,界面卡住或者崩潰);而拋出錯(cuò)誤的目的在于提供錯(cuò)誤發(fā)生具體原因的消息奄薇,以提示我們更準(zhǔn)確的處理他們驳阎。
方法:
捕獲錯(cuò)誤:try-catch-finally
拋出錯(cuò)誤:throw
基本語法:
一,捕獲錯(cuò)誤
try{
// 可能會(huì)導(dǎo)致錯(cuò)誤的代碼
// 如果發(fā)生錯(cuò)誤則停止執(zhí)行,并反饋error對(duì)象給catch
// 然后執(zhí)行catch里面的代碼
} catch(error){
// 在錯(cuò)誤發(fā)生時(shí)怎么處理
// 錯(cuò)誤發(fā)生時(shí)才會(huì)執(zhí)行的代碼
} finally {
// 無論錯(cuò)誤與否都會(huì)執(zhí)行的代碼
// 包括try catch里面的return語句也會(huì)被忽略
}
二呵晚,拋出錯(cuò)誤
// 拋出一個(gè)通用錯(cuò)誤
throw new Error('This is a error message');
demo示例:
一蜘腌,捕獲錯(cuò)誤
<html lang="zh-en">
<head>
</head>
<body>
<script>
console.log(desOfTom);
console.log('This is the next!');
</script>
</body>
</html>
以上代碼會(huì)報(bào)錯(cuò)并導(dǎo)致程序終止,而且不會(huì)執(zhí)行最后的‘console.log('This is the next!');’饵隙,解析結(jié)果如下:
如果我們想讓程序繼續(xù)執(zhí)行撮珠,我們可以引入try catch :
<html lang="zh-en">
<head>
</head>
<body>
<script>
try {
console.log(desOfTom);
} catch(err) {
console.log(err.message)
} finally {
console.log('tom is handsome!');
}
console.log('This is the next!');
</script>
</body>
</html>
以上代碼會(huì)終止執(zhí)行try里面報(bào)錯(cuò)的部分,通過控制臺(tái)拋出錯(cuò)誤消息金矛,并繼續(xù)執(zhí)行finally和try catch之后的‘console.log('This is the next!');’代碼芯急,代碼執(zhí)行結(jié)果如下:
二,拋出錯(cuò)誤
在遇到 throw 操作符時(shí)驶俊,代碼會(huì)立即停止執(zhí)行(同瀏覽器默認(rèn)錯(cuò)誤處理方式)娶耍。僅當(dāng)有 try-catch 語句捕獲到被拋出的值時(shí),代碼才會(huì)繼續(xù)執(zhí)行饼酿。 通過使用某種內(nèi)置錯(cuò)誤類型榕酒,可以更真實(shí)地模擬瀏覽器錯(cuò)誤。每種錯(cuò)誤類型的構(gòu)造函數(shù)接收一個(gè)參數(shù)故俐,即實(shí)際的錯(cuò)誤消息想鹰。下面是一個(gè)例子:
代碼:
<html lang="zh-en">
<head>
</head>
<body>
<script>
throw new Error('This is a error message');
console.log('This is the next!');
</script>
</body>
</html>
運(yùn)行結(jié)果:
以上代碼代碼拋出了一個(gè)通用錯(cuò)誤,帶有一條自定義錯(cuò)誤消息药版。瀏覽器會(huì)像處理自己生成的錯(cuò)誤一樣辑舷, 來處理這行代碼拋出的錯(cuò)誤。換句話說槽片,瀏覽器會(huì)以常規(guī)方式報(bào)告這一錯(cuò)誤何缓,并且會(huì)顯示這里的自定義錯(cuò)誤消息,同時(shí)會(huì)終止代碼執(zhí)行筐乳。像下面使用其他錯(cuò)誤類型歌殃,也可以模擬出類似的瀏覽器錯(cuò)誤。
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.");
在創(chuàng)建自定義錯(cuò)誤消息時(shí)常用的錯(cuò)誤類型是 Error蝙云、RangeError氓皱、ReferenceError 和TypeError。
下面是一個(gè)try-catch捕捉throw錯(cuò)誤的例子勃刨,try-catch會(huì)像捕捉瀏覽器自己生成的錯(cuò)誤一樣捕捉throw拋出的錯(cuò)誤:
代碼:
<html lang="zh-en">
<head>
</head>
<body>
<script>
try {
throw new Error('This is a error message');
} catch(err) {
console.log(err.message)
} finally {
console.log('tom is handsome!');
}
console.log('This is the next!');
</script>
</body>
</html>
運(yùn)行結(jié)果: