天天看點

JavaScript 入門(06)錯誤處理錯誤處理錯誤傳播異步錯誤處理

錯誤處理

  • 使用 try—catch—finally 基本和 java 的用法是一緻的
var r1, r2, s = null;
try {
    r1 = s.length; // 此處應産生錯誤
    r2 = 100; // 該語句不會執行
} catch (e) {
    console.log('出錯了:' + e);
} finally {
    console.log('finally');
}
console.log('r1 = ' + r1); // r1應為undefined
console.log('r2 = ' + r2); // r2應為undefined
           
  • JavaScript有一個标準的Error對象表示錯誤,還有從Error派生的TypeError、ReferenceError等錯誤對象
  • Error 對象的兩個屬性:name 和 message
  • 程式也可以主動抛出一個錯誤,讓執行流程直接跳轉到catch塊,抛出錯誤使用throw語句
var r, n, s;
try {
    s = prompt('請輸入一個數字');
    n = parseInt(s);
    if (isNaN(n)) {
        throw new Error('輸入錯誤');
    }
    // 計算平方:
    r = n * n;
    console.log(n + ' * ' + n + ' = ' + r);
} catch (e) {
    console.log('出錯了:' + e);
}
           

錯誤傳播

  • js 中發生錯誤之後如果沒有try—catch語句的話,錯誤會從發生的地方一層一層往上抛出,直到js引擎中斷程式
  • 我們進行錯誤的處理,不必到處都寫try–catch語句,适當的 地方進行統一處理就可以了
function main(s) {
    console.log('BEGIN main()');
    try {
        foo(s);
    } catch (e) {
        console.log('出錯了:' + e);
    }
    console.log('END main()');
}

function foo(s) {
    console.log('BEGIN foo()');
    bar(s);
    console.log('END foo()');
}

function bar(s) {
    console.log('BEGIN bar()');
    console.log('length = ' + s.length);
    console.log('END bar()');
}

main(null);
           

異步錯誤處理

  • 下面的代碼中,錯誤無法被捕獲,原因就在于調用setTimeout()函數時,傳入的printTime函數并未立刻執行!緊接着,JavaScript引擎會繼續執行

    console.log('done');

    語句,而此時并沒有錯誤發生;直到1秒鐘後,執行printTime函數時才發生錯誤,但此時除了在printTime函數内部捕獲錯誤外,外層代碼并無法捕獲
  • 簡單來說就是對于像setTimeout這樣的異步代碼,錯誤的捕獲隻能在回調函數中進行,外部是無法進行的
function printTime() {
    throw new Error();
}

try {
    setTimeout(printTime, 1000);
    console.log('done');
} catch (e) {
    console.log('error');
}
           
  • 修改後的代碼如下
function printTime() {
	try {
    	throw new Error();
    } catch (e) {
    	console.log('error');
	}
}
setTimeout(printTime, 1000);
console.log('done');
           
JavaScript 入門(06)錯誤處理錯誤處理錯誤傳播異步錯誤處理

繼續閱讀