js中setTimeout導(dǎo)致try catch無法捕獲異常的問題解決
碰到一個有趣的小問題,setTimeout、ajax異步請求回調(diào)里的代碼發(fā)生了異常,try catch卻沒有捕獲到。
function test(){
try {
setTimeout(function(){
throw 'error';
}, 1);
} catch (e) {
console.log("try catch里捕獲的異常" + e);
}
}
function testAjax(){
try {
$.ajax({
url: "xxx",
cache: false,
success: function(data){
throw 'error';
}
});
} catch (e) {
console.log("try catch里捕獲的異常" + e);
}
}
運行結(jié)果如下:

那么如何捕獲這里面的異常呢?總不可能在每個延時函數(shù)里再增加異常捕獲。
最終找到了:window.onerror
// 注意事項:js中對象初始化慢于方法,在方法調(diào)用時最好加個延遲,讓window.onerror加載完畢。
window.onerror = function(message, source, lineno, colno, error){
// message:錯誤消息(字符串)。在HTML οnerrοr=""處理程序event(sic?。┲锌捎?。
// source:引發(fā)錯誤的腳本的URL(字符串)
// lineno:發(fā)生錯誤的行號(數(shù)值)
// colno:發(fā)生錯誤的行的列號(數(shù)值)
// error:錯誤對象(對象)
var message = [
'Message: ' + msg,
'URL: ' + url,
'Line: ' + lineNo,
'Column: ' + columnNo,
'Error object: ' + JSON.stringify(error)
].join(' - ');
console.log(message);
// 當(dāng)函數(shù)返回true時,這可以防止觸發(fā)默認(rèn)事件處理程序(就是瀏覽器控制臺打印紅色的異常信息)。
return true;
};
到此這篇關(guān)于js中setTimeout導(dǎo)致try catch無法捕獲異常的問題解決的文章就介紹到這了,更多相關(guān)js try catch無法捕獲異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript如何使用dhtmlXTreeObject的loadJSONObject繪制目錄樹
這篇文章主要介紹了JavaScript如何使用dhtmlXTreeObject的loadJSONObject繪制目錄樹,需要引入dhtmlXTreeObject的css和js文件,這里還需要注意js的引用順序,本文給大家介紹的非常詳細(xì),需要的的朋友參考下吧2023-11-11
JavaScript實現(xiàn)下載base64數(shù)據(jù)并兼容低版本
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實現(xiàn)下載base64數(shù)據(jù)并兼容低版本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
詳解全棧開發(fā)Vercel數(shù)據(jù)庫存儲服務(wù)
這篇文章主要為大家介紹了全棧開發(fā)Vercel數(shù)據(jù)庫存儲服務(wù)功能使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
總結(jié)分享10個JavaScript代碼優(yōu)化小tips
這篇文章主要介紹了總結(jié)分享10個JavaScript代碼優(yōu)化小tips,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07

