JavaScript異常

javascript異常

所謂異常就是程序的非正常運行酣藻,通俗的說就是程序發(fā)生了錯誤状勤。至于這些錯誤,有的是認為疏忽造成的異常(Exception)迂求,有的是程序本身的錯誤(Error)默伍。

比如有的時候我們希望兩個數(shù)相加欢嘿,因為人為疏忽,代碼里寫成了乘號也糊,那么這種錯誤大部分情況下是得不到你想要的結(jié)果的炼蹦,但是幸運又不幸的是,這個程序沒有語法錯誤狸剃,依然可以返回結(jié)果掐隐,但是無法報錯。

另一種情況就是你的程序無法被JavaScript引擎執(zhí)行钞馁,這種異常引擎會拋出一個異常虑省,這個時候如果你沒有捕獲異常,那么程序就會被中斷僧凰,無法執(zhí)行下去探颈。

code1:

alert('js運行了!')
let a = b + 1
alert('程序結(jié)束')
pic1

這個時候我們的瀏覽器客戶端作為JavaScript引擎就會捕獲一條異常報告训措,俗稱報錯了伪节。
因為此時代碼中的 b 是尚未定義的光羞,拋出了ReferenceError這個異常,下面是JavaScript中經(jīng)常遇到的異常類型架馋,大概分類有如下幾種:

  • EvalError: raised when an error occurs executing code in eval()
  • RangeError: raised when a numeric variable or parameter is outside of its valid range
  • ReferenceError: raised when de-referencing an invalid reference
  • SyntaxError: raised when a syntax error occurs while parsing code in eval()
  • TypeError: raised when a variable or parameter is not a valid type
  • URIError: raised when encodeURI() or decodeURI() are passed invalid parameters

上面的六種異常對象都繼承自Error對象狞山。他們都支持以下兩種構(gòu)造方法: new Error();
new Error(“異常信息”);

try/catch/finlly語句

上面介紹了幾種程序拋出的異常全闷,那么現(xiàn)在就需要對異常進行處理叉寂,其中try從句中定義了需要處理和判斷的代碼塊,catch從句中放置當程序發(fā)生異常后進行處理的代碼总珠,catch從句后跟隨finally塊屏鳍,finally中放置清理代碼,不管try塊中是否產(chǎn)生異常局服。finally塊中的邏輯代碼都會執(zhí)行钓瞭,其中catch和finally都是可選的,但是必須選擇兩種中之一和try從句組成完整的語句淫奔。
try山涡、catch、finally語句塊都需要使用花括號括起來唆迁,即使語句中只有一條語句也不能省略鸭丛,記住,這里的花括號是必須的

下面的代碼說明了try/catch/finlly語句的用法和作用

try {
    // 這里是你可能會出現(xiàn)異常的代碼
    //  可以通過throw直接拋出異常
    // 或者通過調(diào)用一個方法間接拋出
} catch(e) {
    // 當try語句塊拋出了異常唐责,這里的代碼就會執(zhí)行
    // 可以通過局部變量e來獲取該異常Error對象的信息
    // 可以通過throw重新拋出異常
} finally {
    // 無論是否拋出異常鳞溉,都會執(zhí)行這里的代碼
    // 終止語句塊的方法有:
    // 1. 正常執(zhí)行最后一條語句終止
    // 2. 通過break、continue鼠哥、或return終止
    // 3. 拋出異常熟菲,被try捕獲
    // 4. 拋出異常,異常未被捕獲朴恳,繼續(xù)向上傳播
}

我們看到抄罕,catch后面接了個標識符e,這個標識符和函數(shù)參數(shù)很想于颖,當捕獲一個異常時呆贿,把和這個異常相關(guān)的值(比如Error對象)賦值給這個參數(shù),和普通的變量不同恍飘,這條catch句中的標識符具有塊級作用域榨崩,它只在catch語塊內(nèi)有定義。這個Error對象有幾個主要屬性章母,如下:

  • description: 錯誤描述 (僅IE可用).
  • fileName: 出錯的文件名 (僅Mozilla可用).
  • lineNumber: 出錯的行數(shù) (僅Mozilla可用).
  • message: 錯誤信息 (在IE下同description)
  • name: 錯誤類型.
  • number: 錯誤代碼 (僅IE可用).
  • stack: 像Java中的Stack Trace一樣的錯誤堆棧信息 (僅Mozilla可用).

下面就使用一個try/catch語句把pic1中的代碼包裹起來

try{
    //這里放置可能會出錯的代碼
    let a = b + 1
} catch(e)
{
    //代碼出錯后執(zhí)行這里母蛛。
    console.debug(' name: ' + e.name +  
          ' message: ' + e.message +  
          ' lineNumber: ' + e.lineNumber +  
          ' fileName: ' + e.fileName +  
          ' stack: ' + e.stack);  
} finally {
    console.log('執(zhí)行了finally')
}

將上面的代碼復制到chrome控制臺,會看到下面的信息乳怎,說明異常已經(jīng)被捕獲彩郊,并且前弯,最終執(zhí)行了finally


pic2

通常狀況下,解釋器執(zhí)行到try語句塊的尾部秫逝,然后開始執(zhí)行finally中的代碼恕出,以便進行必要的清理工作。當由于return违帆、continue浙巫、break語句使得解釋器跳出try語句塊時,解釋器在執(zhí)行新的目標代碼之前先執(zhí)行finally中的代碼刷后。

如果在try中產(chǎn)生了異常的畴,而且存在一條與之相關(guān)的catch從句來處理這個異常,解釋器首先執(zhí)行catch中的邏輯尝胆,然后執(zhí)行finally中的邏輯丧裁,如果不存在處理異常的局部catch從句,解釋器會首先執(zhí)行finally中的邏輯含衔,然后向上傳播異常煎娇,直到找到能處理這個異常的catch從句。

如果finally快使用了return贪染、continue缓呛、break或者throw語句時程序發(fā)生跳轉(zhuǎn),或者通過調(diào)用了拋出異常的方法改變了程序執(zhí)行流程抑进,不管這個跳轉(zhuǎn)使程序掛起還是繼續(xù)執(zhí)行强经,解釋器都會將其忽略。例如finally從句拋出一個異常寺渗,這個異常將替代正在拋出的異常匿情。如果finally從句運行倒了return語句,盡管已經(jīng)拋出了異常且這個異常還沒有處理信殊,這個方法依然會正常返回炬称。

throw語句

在JavaScript運行的時候,若使用throw語句時就會電視的拋出異常涡拘。
throw語句的語法如下:

throw expression

expression的值是任意類型的玲躯。可以拋出代表錯誤碼的數(shù)字亦或是讓人明白意思的字符串鳄乏。JavaScript解釋器拋出異常的時候通常采用Error類型和其子類型跷车。

function getMoney(money) {
    // 若傳入的參數(shù)非法,直接拋出異常
    if (money < 0) 
        throw new Error('金額不能為負數(shù)')
    return money
}

在chrome控制臺里試試橱野,這個時候如果傳入的參數(shù)小于0就會直接拋出一個自定義字符串的異常了朽缴,見下圖:

pic#

最后

當程序拋出異常時,JavaScript解釋器會立即停止當前正在執(zhí)行的邏輯水援,并跳轉(zhuǎn)至就近的異常處理程序密强,如果拋出異常的代碼塊中沒有try/catch語句茅郎,解釋器會檢查更高層次的閉合代碼塊,看它是否有關(guān)聯(lián)異常處理程序或渤。以此類推系冗,直到找到異常處理程序為止

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市薪鹦,隨后出現(xiàn)的幾起案子掌敬,更是在濱河造成了極大的恐慌,老刑警劉巖距芬,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝开,死亡現(xiàn)場離奇詭異,居然都是意外死亡框仔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門拄养,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离斩,“玉大人,你說我怎么就攤上這事瘪匿□斯#” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵棋弥,是天一觀的道長核偿。 經(jīng)常有香客問我,道長顽染,這世上最難降的妖魔是什么漾岳? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮粉寞,結(jié)果婚禮上尼荆,老公的妹妹穿的比我還像新娘。我一直安慰自己唧垦,他們只是感情好捅儒,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著振亮,像睡著了一般巧还。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坊秸,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天麸祷,我揣著相機與錄音,去河邊找鬼妇斤。 笑死摇锋,一個胖子當著我的面吹牛丹拯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荸恕,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼乖酬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了融求?” 一聲冷哼從身側(cè)響起咬像,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎生宛,沒想到半個月后县昂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡陷舅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年倒彰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莱睁。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡待讳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仰剿,到底是詐尸還是另有隱情创淡,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布南吮,位于F島的核電站琳彩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏部凑。R本人自食惡果不足惜露乏,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砚尽。 院中可真熱鬧施无,春花似錦、人聲如沸必孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷搪。三九已至兴想,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赡勘,已是汗流浹背嫂便。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闸与,地道東北人毙替。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓岸售,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厂画。 傳聞我的和親對象是個殘疾皇子凸丸,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關(guān)的語法袱院,內(nèi)部類的語法屎慢,繼承相關(guān)的語法,異常的語法忽洛,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 通俗編程——白話JAVA異常機制 - 代碼之道腻惠,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語閱讀 3,174評論 0 25
  • 作者的序言 朋友們,棄療系列4出來啦欲虚,作者還并沒有放棄集灌,感覺自己萌萌噠,233苍在。 語句 js程序其實就是一系列可執(zhí)...
    zhaolion閱讀 1,747評論 0 8
  • 初識異常(Exception) 比如我們在取數(shù)組里面的某個值得時候绝页,經(jīng)常會出現(xiàn)定義的取值范圍超過了數(shù)組的大小,那么...
    iDaniel閱讀 1,867評論 1 2
  • 10.14日聽了自媒體組第三次來自洋洋的分享莱没,便想起自己剛剛畢業(yè)的時候初肉,不知道自己想要什么,不知道能做什么饰躲,不敢嘗...
    貓男囈語閱讀 568評論 0 0