錯誤處理
- 使用 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引擎會繼續執行
語句,而此時并沒有錯誤發生;直到1秒鐘後,執行printTime函數時才發生錯誤,但此時除了在printTime函數内部捕獲錯誤外,外層代碼并無法捕獲console.log('done');
- 簡單來說就是對于像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');