異常處理

  • 常見的異常分類

運(yùn)行環(huán)境的多樣性導(dǎo)致的異常(瀏覽器)
語法錯(cuò)誤,代碼錯(cuò)誤

異常的特征:一旦代碼出現(xiàn)異常,后面的代碼就不會(huì)再執(zhí)行

  • 異常捕獲
    使用try-catch語句捕獲異常
try{
    //這里寫可能出現(xiàn)異常的代碼
}catch(e){
    //這里的e就是捕獲的異常對象
    //可以在這里寫,出現(xiàn)異常后的處理代碼
}
  • 異常捕獲語句執(zhí)行的過程為:

  • 01 代碼正常運(yùn)行, 如果在try中出現(xiàn)了錯(cuò)誤, try 里面出現(xiàn)錯(cuò)誤的語句后面的代碼都不再執(zhí)行, 直接跳轉(zhuǎn)到 catch 中

  • 02 在catch中處理錯(cuò)誤信息

  • 03 繼續(xù)執(zhí)行后面的代碼

  • 04 如果 try 中沒有出現(xiàn)錯(cuò)誤, 那么不走 catch 直接執(zhí)行后面的代碼

  • 捕獲異常的優(yōu)點(diǎn):通過try-catch語句進(jìn)行異常捕獲之后,代碼將會(huì)繼續(xù)執(zhí)行,而不會(huì)中斷。
    ****注意****:語法錯(cuò)誤異常用try-catch語句無法捕獲,因?yàn)樵陬A(yù)解析階段,語法錯(cuò)誤會(huì)直接檢測出來,而不會(huì)等到運(yùn)行的時(shí)候才報(bào)錯(cuò)。

  • try..catch使用示例

 //01 try ... catch結(jié)構(gòu)的使用
    //a();  若直接調(diào)用則爆出:Uncaught ReferenceError: a is not defined錯(cuò)誤
    //在開發(fā)中,我們對于可能會(huì)報(bào)錯(cuò)或者是發(fā)生異常的代碼用try結(jié)構(gòu)進(jìn)行處理

    try{
        a();    //如果發(fā)生異常,那么至少不會(huì)到正程序中斷
    }
    catch(e) {
        //如果try語句中發(fā)生了異常,那么會(huì)執(zhí)行此處的代碼塊
        //參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
        console.log(e);
    }

    function functionTest() {
        console.log("functionTest");
    };
    functionTest();

    //結(jié)論:使用try...catch結(jié)構(gòu),如果發(fā)生了異常,那么不會(huì)影響后面代碼的執(zhí)行,且我們可以在發(fā)生異常信息之后做出具體的處理
  • 手動(dòng)拋出異常

   語法 throw 具體的信息
    拋出的內(nèi)容:字符串 + 對象
    自己編碼規(guī)范:如果出錯(cuò)或者是有異常,那么就拋出一個(gè)對象(msg code)
    函數(shù)未定義   1001
    變量未定義   1002
    訪問了錯(cuò)誤的數(shù)據(jù) 1003

案例:自己寫的一個(gè)函數(shù),需要一個(gè)參數(shù),如果用戶不傳參數(shù),此時(shí)想直接給用戶拋出異常,就需要了解如何拋出異常。

  • 拋出異常使用throw關(guān)鍵字,語法如下:

手動(dòng)拋出異常信息(字符串)

 try{
        //a();    //如果發(fā)生異常,那么至少不會(huì)到正程序中斷

        //不使用系統(tǒng)默認(rèn)的異常信息,嘗試手動(dòng)拋出
        throw "對不起,您調(diào)用了尚未定義的方法";
    }
    catch(e)
    {
        //如果try語句中發(fā)生了異常,那么會(huì)執(zhí)行此處的代碼塊
        //參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
        console.log(e);
    }

    function functionTest() {
        console.log("functionTest");
    };
    functionTest();

手動(dòng)拋出異常信息(對象)

 try{
        //a();    //如果發(fā)生異常,那么至少不會(huì)到正程序中斷

        //不使用系統(tǒng)默認(rèn)的異常信息,嘗試手動(dòng)拋出
        throw {
            errMsg:"具體的錯(cuò)誤信息提示",
            errCode:"指定錯(cuò)誤類型的代號,如1001等"
        };
    }
    catch(e)
    {
        //如果try語句中發(fā)生了異常,那么會(huì)執(zhí)行此處的代碼塊
        //參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
        console.log(e);

        //在try語句中拋出的錯(cuò)誤信息是什么,那么得到的異常信息就是什么
        //如果拋出的是字符串,那么得到的就是字符串
        //如果拋出的是對象,那么此處得到的就是對象
        console.log(e.errMsg);
        console.log(e.errCode);
    }

    function functionTest() {
        console.log("functionTest");
    };
    functionTest();

異常捕獲語句的完整模式
異常捕獲語句的完整模式為try-catch-finally

 try{
        //在執(zhí)行的時(shí)候可能發(fā)生異常的代碼
        b();
    }
    catch (e)
    {
        //如果try代碼塊中的代碼在執(zhí)行中發(fā)生了異常,那么就會(huì)執(zhí)行該代碼塊的代碼
        //通過打印e對象可以查看具體的異常信息
        console.log(e); //打印異常信息
    }
    finally {
        //不論try語句中的代碼是否會(huì)發(fā)生異常,都一定會(huì)執(zhí)行此處的代碼塊
        //一般在前端開發(fā)中很少使用,常用語后臺(tái)開發(fā)的資源釋放工作
        console.log("無論如何總要執(zhí)行的代碼");
    }

finally中的代碼,不管是否發(fā)生異常,都會(huì)執(zhí)行。一般用在后端語言中,用來釋放資源,JavaScript中很少會(huì)用到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 初識(shí)異常(Exception) 比如我們在取數(shù)組里面的某個(gè)值得時(shí)候,經(jīng)常會(huì)出現(xiàn)定義的取值范圍超過了數(shù)組的大小,那么...
    iDaniel閱讀 1,966評論 1 2
  • Java異常類型 所有異常類型都是Throwable的子類,Throwable把異常分成兩個(gè)不同分支的子類Erro...
    予別她閱讀 1,030評論 0 2
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過程中阻礙程序正常執(zhí)行的錯(cuò)誤事件,當(dāng)一個(gè)程序出現(xiàn)錯(cuò)誤時(shí),可能的情況有如下3種: 語法...
    niaoge2016閱讀 5,612評論 2 20
  • “簡單不先于復(fù)雜,而是在復(fù)雜之后.” —— Alan Perlis Java異常 異常指不期而至的各種狀況,如:文...
    白襯衫少年閱讀 522評論 0 0
  • 《青の炎》。隱忍的十七歲。殘酷的青春。青少年完美犯罪。完全的冷暴力。雖然他的犯罪手法無暇,可他的證詞漏洞百出。他明...
    Mon阿修閱讀 285評論 0 0

友情鏈接更多精彩內(nèi)容