這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰vue
Javascript 引擎是單線程的,所以一旦遇到異常,Javascript 引擎一般會中止執行,阻塞後續代碼並拋出一個異常信息,所以對於可預見的異常,咱們應該捕捉並正確展現給用戶或開發者。express
當運行時錯誤產生時,Error的實例對象會被拋出。
該錯誤對象有兩個屬性:
err.name
:錯誤的名稱/錯誤的類型
err.message
:錯誤的提示信息promise
建立一個Error
new Error([message[,fileName[,lineNumber]]])
markdown
錯誤類型 js共定義了下列 7 種錯誤類型:函數
有些JavaScript代碼沒有語法上的錯誤,可是存在邏輯錯誤,對於這種錯誤,JavaScript不會拋出異常,這時候咱們能夠本身定義一個error對象的實例,並使用throw語句來主動拋出異常。在程序中咱們能夠經過使用throw語句有目的的拋出異常,其語法格式以下:post
throw new Error("errorstatements")
性能
finally
塊中拋出異常信息時會覆蓋掉 try
塊中的異常信息try {
try {
throw new Error('can not find it1');
} finally {
throw new Error('can not find it2');
}
} catch (err) {
console.log(err.message);
}
// can not find it2
複製代碼
finally
塊中返回一個值,那麼這個值將會成爲整個 try-catch-finally
的返回值,不管是否有 return
語句在 try
和 catch
中。這包括在 catch
塊裏拋出的異常。function test() {
try {
throw new Error('can not find it1');
return 1;
} catch (err) {
throw new Error('can not find it2');
return 2;
} finally {
return 3;
}
}
console.log(test()); // 3
複製代碼
有一個你們衆所周知的反優化模式就是使用 try/catch
優化
在V8(其餘JS引擎也可能出現相同狀況)函數中使用了 try/catch
語句不可以被V8編譯器優化.ui
經過在 window.onerror
上定義一個事件監聽函數,程序中其餘代碼產生的未被捕獲的異常每每就會被 window.onerror
上面註冊的監聽函數捕獲到spa
window.onerror = function (message, source, lineno, colno, error) { }
複製代碼
在 JavaScript 函數中,只有 return / yield / throw 會中斷函數的執行,reject 不會阻止繼續執行
示例:
沒有 return 的 reject
Promise.resolve()
.then(() => {
console.log('before excute reject');
reject(new Error('throw error'));
console.log('after excute reject');
})
.catch((err) => {
console.log(err.message);
});
// before excute reject
// throw error
// after excute reject
複製代碼
用了 return 的 reject
Promise.resolve()
.then(() => {
console.log('before excute reject');
return reject(new Error('throw error'));
console.log('after excute reject'); //*** 區別在這裏,return 的話這裏不會執行了
})
.catch((err) => {
console.log(err.message);
});
// before excute reject
// throw error
複製代碼
Vue.config.errorHandler = (err, vm, info) => {
console.error("經過vue errorHandler捕獲的錯誤");
console.error(err);
console.error(vm);
console.error(info);
};
複製代碼