(3) 錯(cuò)誤和調(diào)試

3. 錯(cuò)誤和調(diào)試

1. 錯(cuò)誤處理

任何成熟的編程都必須處理錯(cuò)誤信息

try {
    // 可能導(dǎo)致錯(cuò)誤的代碼
} catch (e) {
    // 在錯(cuò)誤發(fā)生時(shí)執(zhí)行
} finally {
    // 最后執(zhí)行
}

注意

1. finally可選
2. 無論**try/catch**執(zhí)行哪塊涩赢,此處finally都將執(zhí)行茵休,即使有return語句
3. 合理使用try-catch:**適合處理我們無法控制的錯(cuò)誤**(引用第三方規(guī)范的庫)

2. 錯(cuò)誤類型

  1. Error

    1. 基本類型嘲碱,其他錯(cuò)誤類型都繼承該類型
    2. Error錯(cuò)誤很少見煌茬,如果有累奈,一般都是瀏覽器拋出
  2. EvalError:使用eval()函數(shù)而發(fā)生異常時(shí)被拋出(少見贬派,不推薦使用eval)

  3. RangeError:在數(shù)值超出相應(yīng)范圍時(shí)觸發(fā)

    var arr = new Array(-20);
    var arr = new Array(Number.MAX_VALUE);
    
  4. ReferenceError

    1. 訪問不存在的變量
    console.log(title)
    
    1. 找不到對(duì)象
    console.log(obj.title);
    
  5. SyntaxError:直接導(dǎo)致JavaScript代碼立即停止執(zhí)行。

  6. TypeError:執(zhí)行特定于類型的操作時(shí)澎媒,變量的類型不符合要求

    1. 在變量中保存意外的類型
    2. 訪問不存在方法
    var o = new 10;
    alert('name' in true);
    Function.call('name')
    
  7. URIError:使用encodeURI()/decodeURI()的時(shí)候搞乏,格式不正確,導(dǎo)致該錯(cuò)誤戒努,但概率很低

3. 拋出錯(cuò)誤

關(guān)鍵字 throw 拋出錯(cuò)誤请敦,遇到throw操作符,代碼會(huì)立即停止執(zhí)行(除非遇到try-catch捕獲储玫,代碼才可以執(zhí)行)

  1. 拋出錯(cuò)誤
throw 123456;
throw 'hello world';
throw true;
throw { name: 'hello world' };
  1. 拋出上面錯(cuò)誤類型中的某種
throw new Error('something is wrong');
throw new TypeError('something is wrong');
throw new RangeError('something is wrong');
throw new ReferenceError('something is wrong');
...
  1. 自定義錯(cuò)誤
function CustomError(message) {
    this.name = 'custom error';
    this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError('something is wrong');

4. 錯(cuò)誤事件

任何沒有通過try-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的error事件(DOM0標(biāo)準(zhǔn))

5. 常見的錯(cuò)誤類型

  1. 類型轉(zhuǎn)換錯(cuò)誤

    // 用 ===
    5 == '5' // true
    5 === '5'    // false
    
    // str3隱性轉(zhuǎn)為布爾值侍筛,如果str3位'', 0, false等值,則結(jié)果不可預(yù)料
    function concat (str1, str2, str3) {
        var result = str1 + str2;
        
        if (str3) {
            result += str3;
        }
        return result;
    }
    
  2. 數(shù)據(jù)類型錯(cuò)誤

    // 任何非字符串值都會(huì)導(dǎo)致錯(cuò)誤
    function getQueryString (url) {
        var pos = url.indexOf('?');
        if (pos > -1) {
            return url.substring(pos + 1);
        }
        
        return  '';
    }
    
    // 更恰當(dāng)
    function getQueryString (url) {
     // 增加對(duì)參數(shù)類型判斷撒穷,增加容錯(cuò)能力
     if (typeof url === 'string') {
         var pos = url.indexOf('?');
         if (pos > -1) {
             return url.substring(pos + 1);
         }
        }
    
        return  '';
    }
    
    function reverseSort (values) {
        if (values) {    // 不要這樣O灰!端礼!
            values.sort();
            values.reverse();
        }
    }
    
    function reverseSort (values) {
        if (values != null) {    // 不要這樣G菪Α!齐媒!
            values.sort();
            values.reverse();
        }
    }
    
    function reverseSort (values) {
        if (typeof value.sort == 'function') {   // 不要這樣F衙俊!喻括!
            values.sort();
            values.reverse();
        }
    }
    
    function reverseSort (values) {
        if (values instanceof Array) {   // 最合適
            values.sort();
            values.reverse();
        }
    }
    
  3. 通信錯(cuò)誤:主要是Ajax錯(cuò)誤和URL/發(fā)送數(shù)據(jù)有關(guān)(后期補(bǔ)充邀杏。。唬血。)

6. 調(diào)試代碼

  1. 在控制欄直接打印信息

    console.log(title);  // 打印普通變量
    
    console.dir(obj);    // 打印對(duì)象結(jié)構(gòu)
    
    console.table(list); // 打印list類數(shù)組對(duì)象
    
    console.assert();    // 判斷第一個(gè)參數(shù)是否為真望蜡,false的話拋出異常并且在控制臺(tái)輸出相應(yīng)的信息
    
    console.clear(); // 清空控制臺(tái)
    
    console.error(); // 打印錯(cuò)誤信息
    console.warn();  // 打印警告信息
    
    
    // 你可以啟動(dòng)一個(gè)計(jì)時(shí)器(timer)來跟蹤某一個(gè)操作的占用時(shí)長(zhǎng)。每一個(gè)計(jì)時(shí)器必須擁有唯一的名字拷恨,頁面中最多能同時(shí)運(yùn)行10,000個(gè)計(jì)時(shí)器脖律。當(dāng)以此計(jì)時(shí)器名字為參數(shù)調(diào)用 console.timeEnd() 時(shí),瀏覽器將以毫秒為單位腕侄,輸出對(duì)應(yīng)計(jì)時(shí)器所經(jīng)過的時(shí)間.
    console.time(timeName);
    // 需要停止的計(jì)時(shí)器名字小泉。一旦停止芦疏,計(jì)時(shí)器所經(jīng)過的時(shí)間會(huì)被自動(dòng)輸出到控制臺(tái)。
    console.timeEnd(timeName);   
    
  2. debugger

    debugger 語句調(diào)用任何可用的調(diào)試功能微姊,例如設(shè)置斷點(diǎn)酸茴。 如果沒有調(diào)試功能可用,則此語句不起作用

    debugger;
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兢交,一起剝皮案震驚了整個(gè)濱河市薪捍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌配喳,老刑警劉巖酪穿,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晴裹,居然都是意外死亡被济,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門涧团,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉潭,“玉大人,你說我怎么就攤上這事少欺。” “怎么了馋贤?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赞别,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我配乓,道長(zhǎng)仿滔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任犹芹,我火速辦了婚禮崎页,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腰埂。我一直安慰自己飒焦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布屿笼。 她就那樣靜靜地躺著牺荠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驴一。 梳的紋絲不亂的頭發(fā)上休雌,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音肝断,去河邊找鬼杈曲。 笑死驰凛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的担扑。 我是一名探鬼主播恰响,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼魁亦!你這毒婦竟也來了渔隶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤洁奈,失蹤者是張志新(化名)和其女友劉穎间唉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體利术,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呈野,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了印叁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被冒。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轮蜕,靈堂內(nèi)的尸體忽然破棺而出昨悼,到底是詐尸還是另有隱情,我是刑警寧澤跃洛,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布率触,位于F島的核電站,受9級(jí)特大地震影響汇竭,放射性物質(zhì)發(fā)生泄漏葱蝗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一细燎、第九天 我趴在偏房一處隱蔽的房頂上張望两曼。 院中可真熱鬧,春花似錦玻驻、人聲如沸悼凑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佛析。三九已至,卻和暖如春彪蓬,著一層夾襖步出監(jiān)牢的瞬間寸莫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工档冬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膘茎,地道東北人桃纯。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像披坏,于是被迫代替她去往敵國(guó)和親态坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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