js中的錯(cuò)誤捕獲和拋出try-catch-finally throw

原創(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é)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末波材,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子身隐,更是在濱河造成了極大的恐慌廷区,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贾铝,死亡現(xiàn)場(chǎng)離奇詭異隙轻,居然都是意外死亡埠帕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門玖绿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敛瓷,“玉大人,你說我怎么就攤上這事斑匪∧抛眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵蚀瘸,是天一觀的道長(zhǎng)狡蝶。 經(jīng)常有香客問我,道長(zhǎng)贮勃,這世上最難降的妖魔是什么贪惹? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮衙猪,結(jié)果婚禮上馍乙,老公的妹妹穿的比我還像新娘布近。我一直安慰自己垫释,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布撑瞧。 她就那樣靜靜地躺著棵譬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪预伺。 梳的紋絲不亂的頭發(fā)上订咸,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音酬诀,去河邊找鬼脏嚷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞒御,可吹牛的內(nèi)容都是我干的父叙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼肴裙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趾唱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜻懦,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤甜癞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宛乃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠咱,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒸辆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了析既。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吁朦。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渡贾,靈堂內(nèi)的尸體忽然破棺而出逗宜,到底是詐尸還是另有隱情,我是刑警寧澤空骚,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布纺讲,位于F島的核電站,受9級(jí)特大地震影響囤屹,放射性物質(zhì)發(fā)生泄漏熬甚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一肋坚、第九天 我趴在偏房一處隱蔽的房頂上張望乡括。 院中可真熱鬧,春花似錦智厌、人聲如沸诲泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷扫。三九已至,卻和暖如春诚卸,著一層夾襖步出監(jiān)牢的瞬間葵第,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工合溺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卒密,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓棠赛,卻偏偏與公主長(zhǎng)得像哮奇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恭朗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容