1、 throw new Error(); 這個是創建錯誤,創造一個錯誤類型拋出
2、throw error 這個是拋出錯誤。
問題復現
在工作時遇到了需要拋出異常並且需要自己捕獲處理的地方,於是在拋出的地方寫下
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對象中有一個被廣泛支持的屬性:name、message。name:用來存儲錯誤的類型,在ECMA-262定義了七種錯誤類型:Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。詳情見:try-catch語句message:用來存儲error message,就是你new Error()時候穿進去的參數
到此,上面的問題應迎刃而解。
問題解決
由於是異常捕獲時候的錯誤所以我們在捕獲的時候這樣處理
try { parseExcel(con); } catch (error) { if (error。message === 'parse excel failed') { //doSomething } }
至此,問題解決。
反思
我在這之前是從未試用過throw的,在用的時候也是從不深究,馬馬虎虎拿來就用,如果不是因為后來出了問題去解決,估計不會發現原來js的錯誤處理還有很多道道。寫程序是一件很嚴謹的事情,一絲一毫也馬虎不得,更不可想當然。
