1. 程式人生 > 實用技巧 >throw new Error() 真實的用法和throw error 的卻別

throw new Error() 真實的用法和throw error 的卻別

1、 thrownewError(); 這個是建立錯誤,創造一個錯誤型別丟擲

2、throwerror 這個是丟擲錯誤。

問題復現

在工作時遇到了需要丟擲異常並且需要自己捕獲處理的地方,於是在丟擲的地方寫下

function parseExcel(con) {
 try {
    // doSomething
  } catch (error) {
    throw new Error('parse excel failed');
  }
}

在捕獲的地方寫下:

try {
  parseExcel(con);
} catch (error) {
  if (error === 'parse excel failed') {
    
//doSomething } }

當時自己感覺妥妥的,沒毛病。
後來當其他地方出現了詭異的bug,定位問題時才發現這裡的寫法嚴重不對。

問題分析

可以肯定問題出在異常捕獲而不是丟擲。
這裡是使用了throw來丟擲異常,並且還是使用

throw new Error('error message');

這樣的例項化寫法,這樣的寫法是很規範的,是js規範所推崇的。但是這裡需要注意的是,throw出去的是一個Error物件,而類似下面的這種字串

throw 'error message'; // 不建議的寫法

所以捕獲的時候捕獲到的也是一個物件,這樣一個物件與parse excel failed字串比較顯然是不正確的。
那麼該怎麼去捕獲這個error message

呢?
通過對《JavaScript高階程式設計 (第三版) 》對於丟擲錯誤的學習我們可以瞭解到:

在丟擲的Error物件中有一個被廣泛支援的屬性:namemessage
name:用來儲存錯誤的型別,在ECMA-262定義了七種錯誤型別:ErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError。詳情見:try-catch語句
message:用來儲存error message,就是你new Error()時候穿進去的引數

到此,上面的問題應迎刃而解。

問題解決

由於是異常捕獲時候的錯誤所以我們在捕獲的時候這樣處理

try {
    parseExcel(con);
} catch (error) {
    if (error。message === 'parse excel failed') {
        //doSomething
    }
}

至此,問題解決。

反思

我在這之前是從未試用過throw的,在用的時候也是從不深究,馬馬虎虎拿來就用,如果不是因為後來出了問題去解決,估計不會發現原來js的錯誤處理還有很多道道。寫程式是一件很嚴謹的事情,一絲一毫也馬虎不得,更不可想當然。