js中setTimeout導(dǎo)致try catch無法捕獲異常的問題解決
碰到一個(gè)有趣的小問題,setTimeout、ajax異步請(qǐng)求回調(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);
}
}
運(yùn)行結(jié)果如下:

那么如何捕獲這里面的異常呢?總不可能在每個(gè)延時(shí)函數(shù)里再增加異常捕獲。
最終找到了:window.onerror
// 注意事項(xiàng):js中對(duì)象初始化慢于方法,在方法調(diào)用時(shí)最好加個(gè)延遲,讓window.onerror加載完畢。
window.onerror = function(message, source, lineno, colno, error){
// message:錯(cuò)誤消息(字符串)。在HTML οnerrοr=""處理程序event(sic!)中可用。
// source:引發(fā)錯(cuò)誤的腳本的URL(字符串)
// lineno:發(fā)生錯(cuò)誤的行號(hào)(數(shù)值)
// colno:發(fā)生錯(cuò)誤的行的列號(hào)(數(shù)值)
// error:錯(cuò)誤對(duì)象(對(duì)象)
var message = [
'Message: ' + msg,
'URL: ' + url,
'Line: ' + lineNo,
'Column: ' + columnNo,
'Error object: ' + JSON.stringify(error)
].join(' - ');
console.log(message);
// 當(dāng)函數(shù)返回true時(shí),這可以防止觸發(fā)默認(rèn)事件處理程序(就是瀏覽器控制臺(tái)打印紅色的異常信息)。
return true;
};
到此這篇關(guān)于js中setTimeout導(dǎo)致try catch無法捕獲異常的問題解決的文章就介紹到這了,更多相關(guān)js try catch無法捕獲異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
防止瀏覽器記住用戶名及密碼的簡(jiǎn)單實(shí)用方法
很多瀏覽器都有自動(dòng)填寫功能,我在input上使用了autocomplete="off",但在有的瀏覽器上還是被記住了用戶名跟密碼,請(qǐng)問有沒有更有效及簡(jiǎn)便的方法來防止瀏覽器記住用戶名及密碼2013-04-04
深入淺析JavaScript中對(duì)事件的三種監(jiān)聽方式
最近這段時(shí)間因?yàn)槊刻煲薷木W(wǎng)站,為網(wǎng)站做特效,所以看了很多的js接觸事件,自己只會(huì)使用一小部分,有時(shí)用的時(shí)候也比較混亂,現(xiàn)在系統(tǒng)的整理了一下,本篇文章跟大家分享的是JavaScript中對(duì)事件的三種監(jiān)聽方式2015-09-09
js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)
本文主要介紹了js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)的思路與方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
判斷JavaScript中的兩個(gè)變量是否相等的操作符
可能有些同學(xué)看到這個(gè)標(biāo)題就會(huì)產(chǎn)生疑惑,為什么我們要判斷JavaScript中的兩個(gè)變量是否相等,JavaScript不是已經(jīng)提供了雙等號(hào)“==”以及三等號(hào)“===”給我們使用了嗎2019-12-12

