JavaScript前端常見異常及如何捕獲詳解
全局捕獲-架構(gòu)側(cè)
js全局異常捕獲:window.onEerror 和 window.addEventLisenter('error')
Promise全局異常捕獲:unhandledrejection
框架級(jí)的全局異常捕獲
React:React
的ErrorBoundary
// ErrorBoundary的示例 class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, info) { this.setState({ hasError: true }); // 在這里可以做異常的上報(bào) logErrorToMyService(error, info); } render() { if (this.state.hasError) { return <h1>Something went wrong.</h1>; } return this.props.children; } <ErrorBoundary> <MyWidget /> </ErrorBoundary>
Vue:Vue
的Vue.config.errorHandler
axios: 請(qǐng)求統(tǒng)一底層封裝異常處理攔截器 interceptors
全局捕獲-框架層
Vue 用 errorHandler 和 React 用 componentDidCatch
局部捕獲-業(yè)務(wù)側(cè)
可疑代碼塊try-catch
try catch能捕獲捉到運(yùn)行時(shí)非異步錯(cuò)誤,無法捕獲語法錯(cuò)誤和異步錯(cuò)誤。這個(gè)需要注意。
合理使用,不要過度使用。有得異常需要拋出去給外部處理。
常見的需要注意用try-catch包裹,捕獲異常的情況
JSON處理必須使用try catch捕獲異常
try { const res=fetch(*) JSON.parse(res); // res 為服務(wù)端返回的數(shù)據(jù) } catch(e) { // 捕獲到詳細(xì)的錯(cuò)誤,在這里處理日志上報(bào)或其他異常處理等邏輯,如是否提示用戶,是否有異常下的兜底數(shù)據(jù),比如使用緩存數(shù)據(jù)等 console.error("服務(wù)端數(shù)據(jù)格式返回異常,無法解析", res); } // 注意:下面的異常try catch無法捕獲 try { setTimeout(() => { undefined.map(v => v); }, 1000) } catch(e) { console.log("捕獲到異常:", e); }
async await異步請(qǐng)求
正則表達(dá)式處理
buffer處理
Promise異常
注意未被捕獲的promise異常會(huì)作為全局異常拋出。
局部Promise捕獲兩種方式:
// 1. Promise().catch() let promise = new Promise((resolve,reject)=>{}).catch(e=>{ // handle error }) // 2. async/await + try/catch let promise = new Promise(); async function test() { try { await promise; } catch (e) { // handle error } }
用Promise().catch(),
全局Promise異常用window.addEventListener("unhandledrejection")
注意:
Promise自己的異常只能被自己catch, 或在try/catch里以await的方式調(diào)用來捕獲。否則就會(huì)作為ERR_UNHANDLED_REJECTION異常拋出到全局。
外層Promise不能不能捕獲內(nèi)層Promise的異常。
let p1 = new Promise(async (resolve, reject) => { return reject(100); // 被捕獲 }); async function fn() { try { let result = await p1; console.log(2, result); //這里不會(huì)執(zhí)行 } catch (e) { console.log("e:", e); //這里不會(huì)執(zhí)行 } } fn();
let p1 = new Promise(async (resolve, reject) => { return reject(100); // 未被捕獲,會(huì)拋出全局異常:ERR_UNHANDLED_REJECTION }); function fn() { try { let result = p1; console.log(2, result); //這里不會(huì)執(zhí)行 } catch (e) { console.log("e:", e); //這里不會(huì)執(zhí)行 } } fn();
let p1 = new Promise(async (resolve, reject) => { console.log("after reject"); return Promise.reject(100); // 未被捕獲,會(huì)拋出全局異常:ERR_UNHANDLED_REJECTION }); async function fn() { try { let result = await p1; console.log(2, result); //這里不會(huì)執(zhí)行 } catch (e) { console.log("e:", e); //這里不會(huì)執(zhí)行 } } fn();
let p1 = new Promise(async (resolve, reject) => { return Promise.reject(100); // 未被捕獲,會(huì)拋出全局異常:ERR_UNHANDLED_REJECTION }).catch((e) => { console.log("promise out e", e); // 這里不會(huì)執(zhí)行 }); async function fn() { try { let result = await p1; console.log(2, result); //這里不會(huì)執(zhí)行 } catch (e) { console.log("e:", e); //這里不會(huì)執(zhí)行 } } fn();
Promise里同步拋出的異常,會(huì)觸發(fā)Promise.reject而被捕獲。但異步拋出的異常,不會(huì)觸發(fā)Promise.reject,因此不會(huì)被捕獲。
new Promise((resolve, reject) => { throw new Error("Error1"); // 等效于reject }).catch((e) => { console.log("異常被捕獲到了1"); }); new Promise(async (resolve, reject) => { reject(new Error("Error2")); }).catch((e) => { console.log("異常被捕獲到了2"); }); new Promise(async () => { throw new Error("Error3"); }).catch((e) => { console.log("異常被捕獲到了3"); });
接口請(qǐng)求異常
Fetch 用async await + try catch
Axios 請(qǐng)求,自行處理自定義的異常上報(bào)
全局靜態(tài)資源異常監(jiān)控
window.addEventListener("error") 或者資源標(biāo)簽的onError屬性
到此這篇關(guān)于JavaScript前端常見異常及如何捕獲詳解的文章就介紹到這了,更多相關(guān)JavaScript異常捕獲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序保存圖片到相冊(cè)權(quán)限設(shè)置
這篇文章主要為大家詳細(xì)介紹了微信小程序保存圖片到相冊(cè)權(quán)限設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04微信小程序?qū)崿F(xiàn)左右聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左右聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Bootstrap 表單驗(yàn)證formValidation 實(shí)現(xiàn)表單動(dòng)態(tài)驗(yàn)證功能
這篇文章主要介紹了Bootstrap 表單驗(yàn)證formValidation 實(shí)現(xiàn)表單動(dòng)態(tài)驗(yàn)證功能,需要的朋友可以參考下2017-05-05JavaScript裝箱及拆箱boxing及unBoxing用法解析
這篇文章主要介紹了JavaScript裝箱及拆箱boxing及unBoxing用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06基于JavaScript實(shí)現(xiàn)熔巖燈效果導(dǎo)航菜單
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)熔巖燈效果導(dǎo)航菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01JS簡(jiǎn)單獲取及顯示當(dāng)前時(shí)間的方法
這篇文章主要介紹了JS簡(jiǎn)單獲取及顯示當(dāng)前時(shí)間的方法,涉及javascript針對(duì)日期與時(shí)間的獲取與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2016-08-08js中異步函數(shù)async function變同步函數(shù)的簡(jiǎn)單入門
這篇文章主要介紹了js中異步函數(shù)async function變同步函數(shù)的簡(jiǎn)單入門,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04