1. 異常處理之try...catch...finally語句
(1). 語法:
try {
// 可能會引起報錯的代碼。如果代碼沒有報錯,則會執行此代碼。否則,系統會執行catch裏的代碼。
} catch (error){
- // 注意:(error) 在ES2019以後可以省略。即:try {} catch{}。
// 處理異常發生時的代碼。如果代碼發生報錯,則會執行此代碼。否則,系統會直接忽略此代碼。
} finally {
// 無論異常是否發生,都一定會執行的代碼。
}
如:// 調用一個並不存在的函數
let animal = 'cat';
try {
let isAnimal = isAnimal(animal);
} catch (error) {
console.log(error);
} finally {
console.log('End.');
}
// TypeError: isAnimal is not a function
// End.
(2). 注意事項
- 由於finally裏的語句始終會被執行,導致try和catch中的return語句都會被系統直接忽略。
如:function example() {
try {
return 'a';
} catch (e) {
return e;
} finally {
teturn "End.";
}
}
console.log(example()); // End.
2. 抛出異常 throw exception
(1). 語法:
- throw 表達式;
如:function isNumber(num) {
if (typeof num === 'number'){
return true;
} else {
throw num + ' is not a number.';
}
}
console.log(isNumber('p')); // Error: p is not a number.
// 如果使用try...catch語句捕捉報錯的話
function isNumber(num) {
if (typeof num === 'number'){
return true;
} else {
throw num + ' is not a number.';
}
}
try {
console.log(isNumber('p'));
} catch (e) {
console.log(e);
} // p is not a number.
(2). Error類
- throw語句也可以抛出Error類的實例。
如:function isNumber(num) {
if (typeof num === 'number'){
return true;
} else {
throw new Error (num + ' is not a number.');
}
}
try {
console.log(isNumber('p'));
} catch (e) {
console.log(e);
} // Error: p is not a number.
(3). 用戶還可以自定義異常
- 通過繼承Error類,用戶可以自定義一個新的異常。
如:// 自定義一個異常
class NumberError extends Error {
constructor(number){
super(`${number} is not a number.`);
this.name = 'NotNumber';
}
}
// 在函數中使用該自定義異常
function isNumber(num) {
if (typeof num === 'number'){
return true;
} else {
throw new NumberError (num);
}
}
// 測試自定義異常是否能夠正常使用。
try {
console.log(isNumber('p'));
} catch (e) {
console.log(e);
} // NotNumber: p is not a number.