0%

捕捉錯誤的方法

throw -> 扔出

前幾天和 Mentor 討論程式時,他使用了 throw new Error 來測試,覺得學到新的東西了,所以來記錄一下。
通常我們在捕捉錯誤時會使用try, catch的方式,但如果使用throw new Error是製造了一個錯誤,然後試著自己捕捉錯誤的方法。

throw new Error(‘error message’);
這是實例化寫法,是JavaScript規範所推崇的的寫法。需要注意的是 throw 拋出去的可以是單純的字串,也可以是物件,也就是說會有key 和 value。也因此如果在throw後面加字串就不能依物件的屬性名稱來捕捉錯誤,而會單純捕捉到我們定義的字串錯誤訊息。

1
2
3
4
5
6
7
8
9
10
11
12
// try, catch, finally
try {
console.log('1. try 從這裡開始跑');
// 在這裡故意放個不是語法的單字
testerror;
console.log('2. try 的結尾但不會跑到這裡');
} catch(error){
console.log('3. 錯誤發生', error.stack); // .stack 會印出出錯的位置
} finally {
console.log('4.無論如何會跑到這裡');
}
console.log('5. 程式最後面的位置');

執行結果

1
2
3
4
1. try 從這裡開始跑
VM10:7 3. 錯誤發生 ReferenceError: testerror is not defined at <anonymous>:4:3
VM10:9 4.無論如何會跑到這裡
VM10:11 5. 程式最後面的位置

假設我們有個物件,當我們要檢查這個物件是不是存在某個屬性存不存在時,就可以throw來自定義錯誤訊息

1
2
3
4
5
6
7
8
9
10
11
12
let json = '{ "age" : 42}'
try {
const user = JSON.parse(json) // 轉成正確JSON格式
if(!user.name) {
throw new SyntaxError('資料不齊全:沒有name')
}
console.log(user.name); // 如果有就印出來
} catch(error){
console.log('JSON error: ',error.message );
console.log('JSON error: ',error.name ); // 印出錯誤的名稱會是 SyntaxError
}
// JSON error: 資料不齊全:沒有name

https://www.youtube.com/watch?v=cFTFtuEQ-10

使用 throw 創建一個錯誤實例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 拋出的地方 創建錯誤實例
function testNumber(Number) {
try {
// doSomething
} catch(error) {
throw new Error('not Number')
}
}
// 捕獲此錯誤
try {
testNumber(Number)
} catch(error) {
error.message === 'not Number'
// doSomething
console.log('error.message :', error.message)
}

所以捕獲的時候捕獲到的也是一個對象,這樣一個對象與parse excel failed字符串比較顯然是不正確的。
那麼該怎麼去捕獲這個error message呢?
通過對《JavaScript高級程序設計(第三版) 》對於拋出錯誤的學習我們可以了解到:

在拋出的Error對像中有一個被廣泛支持的屬性:name、message。
name:用來存儲錯誤的類型,在ECMA-262定義了七種錯誤類型:Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。詳情見:try-catch語句
message:用來存儲error message,就是你new Error()時候穿進去的參數
到此,上面的問題應迎刃而解。

throw new Error(); 這是創建一個錯誤實例,創造一個錯誤類型拋出。
throw error 是拋出錯誤。