在工做時遇到了須要拋出異常而且須要本身捕獲處理的地方,因而在拋出的地方寫下javascript
function parseExcel(con) { try { // doSomething } catch (error) { throw new Error('parse excel failed'); } }
在捕獲的地方寫下:html
try { parseExcel(con); } catch (error) { if (error === 'parse excel failed') { //doSomething } }
當時本身感受妥妥的,沒毛病。
後來當其餘地方出現了詭異的bug,定位問題時才發現這裏的寫法嚴重不對。java
能夠確定問題出在異常捕獲而不是拋出。
這裏是使用了throw
來拋出異常,而且仍是使用segmentfault
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()
時候穿進去的參數excel
到此,上面的問題應迎刃而解。code
因爲是異常捕獲時候的錯誤因此咱們在捕獲的時候這樣處理htm
try { parseExcel(con); } catch (error) { if (error。message === 'parse excel failed') { //doSomething } }
至此,問題解決。對象
我在這以前是從未試用過throw
的,在用的時候也是從不深究,馬馬虎虎拿來就用,若是不是由於後來出了問題去解決,估計不會發現原來js的錯誤處理還有不少道道。寫程序是一件很嚴謹的事情,一絲一毫也馬虎不得,更不可想固然。