当前位置: 首页 > Web前端 > JavaScript

Vue项目处理报错如此轻松

时间:2023-03-26 22:52:18 JavaScript

寮傚父澶勭悊鐨勬剰涔夐殢鐫€web椤圭洰瓒婃潵瓒婂鏉傦紝寰堝寮傚父閿欒鍦ㄥ紑鍙戝拰娴嬭瘯闃舵寰堥毦鍙戠幇銆傝櫧鐒朵綘鍙兘浼氶伩鍏嶈娉曠瓑甯歌閿欒锛屼絾涓嶅彲閬垮厤鐨勬槸锛屾渶閲嶈鐨勬槸浣犱粛鐒舵棤娉曢娴嬩唬鐮佸湪杩愯鏃剁殑閿欒銆傚亣璁炬湁濡備笅涓€娈礦ue浠g爜锛屽湪鐢熷懡鍛ㄦ湡鐨刢reated闃舵寮傛璇锋眰鎺ユ敹閿欒鐨勬暟鎹紝鍙兘浼氬鑷撮〉闈㈡覆鏌撳嚭閿欙細......created(){this.getSomeData()},methods:{getSomeData(){this.fetch().then((res)=>{this.test=res//鍋囪杩欐槸閿欒鐨勬暟鎹姹倉)},}鑰屽鏋滄祴璇曚汉鍛樺強鏃跺彂鐜拌繖涓敊璇紝褰撲粬鎵撳紑鎺у埗鍙版椂锛屼粬寰€寰€浼氱珛鍗冲緱鍑虹粨璁猴細鍝︼紝鏄墠绔疨ot馃檪鍏跺疄锛屽彲鑳借繕鏈夋洿澶氣€濆疄闄呴」鐩腑鐨剋onderful鈥濋棶棰橈紝濡傛灉閿欒鍙彂鐢熷湪鏌愪簺鐢ㄦ埛绔紝鏄娴嬩笉鍒扮殑锛屾墍浠ユ垜浠細璁や负搴旇鍦ㄧ▼搴忎腑澶勭悊鎹曡幏杩愯鏃堕敊璇紝鍚戞湇鍔″櫒鎶ュ憡閿欒锛岀劧鍚庡垎鏋愬拰鏀硅繘浠g爜鏉ヤ慨澶嶅凡鍙戠敓鐨勯敊璇€傞偅涔堝浣曞鐞嗗拰澶勭悊鏌愪簺鍙兘鍑虹幇鐨勯敊璇氨鎴愪簡鍓嶇寮€鍙戠殑蹇呬慨璇俱€傚綋鐒讹紝浣犲彲浠ュ湪姣忎釜浠g爜鐗囨涓噸澶嶅啓try...catch...锛屽苟涓烘瘡涓狿romise澶勭悊catch锛屼絾杩欓毦鍏嶆樉寰楁湁鐐瑰按灏紝鎵€浠ユ垜鎯宠兘涓嶈兘鐢ㄦ洿浼橀泤鐨勬柟寮忔潵澶勭悊鎵€鏈夌粺涓€寮傚父锛屽叏灞€鎹曡幏閿欒骞朵笂鎶ュ垎鏋愩€傚叾瀹炲湪Vue涓疄鐜拌繖鏍风殑鍏ㄥ眬寮傚父澶勭悊骞朵笉闅俱€傝鎴戜滑鐪嬬湅鎴戞槸鎬庝箞鍋氱殑銆傚浣曞叏灞€鎹曡幏閿欒寮傚父鏌ヨVue鏂囨。銆傛垜浠彲浠ュ彂鐜板湪鍏ㄥ眬閰嶇疆涓湁杩欐牱涓€涓崟鑾烽敊璇殑澶勭悊閽╁瓙errorHandler銆傜敤娉曞緢绠€鍗曪細Vue.config.errorHandler=function(err,vm,info){//`info`鏄疺ue鐗规湁鐨勯敊璇俊鎭紝姣斿閿欒鎵€鍦ㄧ殑鐢熷懡鍛ㄦ湡閽╁瓙//2.2鎵嶆湁銆?+}鍙湁杩欎釜閽╁瓙鍙互澶勭悊澶у鏁癡ue搴旂敤涓殑閿欒锛堟瘮濡傜粍浠剁敓鍛藉懆鏈熶腑鐨勯敊璇紝鑷畾涔変簨浠跺鐞嗗嚱鏁板唴閮ㄩ敊璇紝v-onDOM鐩戝惉鍣ㄥ唴閮ㄦ姏鍑虹殑閿欒锛夛紝浠ュ強鑷甫鐨刬nfo鍙傛暟callback杩樻爣璁颁簡杩欎釜閿欒鍙兘灞炰簬鍝绫诲瀷鐨勯敊璇€傚悓鏃讹紝瀹冭繕鍙互澶勭悊杩斿洖鍒癙romise閾剧殑閿欒銆傚彲浠ヨ鏄緢寮哄ぇ浜嗭紝浣嗘槸涔熶笉鑳藉鐞嗘墍鏈夌殑寮傚父锛屼笉鐒舵枃绔犲氨瀹屼簡~鎺ヤ笅鏉ユ垜浠潵娴嬭瘯涓€涓嬨€傚厛鍦ㄥ叏灞€閿欒鎹曡幏涓緭鍑烘棩蹇楋紝寮€濮嬭繍琛岃姹傛暟鎹敊璇ず渚嬶細Vue.config.errorHandler=function(err,vm,info){console.log('vue寮傚父閿欒鎹曡幏:','Anerroroccurred鍦?+info)}涓紝鍙互鐪嬪埌寮傚父琚垚鍔熸崟鑾凤紝鍥犱负鎴戜滑妯℃嫙浜嗘暟鎹敊璇鑷存覆鏌撻敊璇紝鎵€浠ラ敊璇彂鐢熷湪娓叉煋灞傘€傚鏋滃嚱鏁颁腑鐨凱romise鍙戠敓閿欒鎬庝箞鍔烇紵璁╂垜浠瘯璇曪細asynccreated(){awaitthis.getSomeData()},method:{asyncgetSomeData(){constres=awaitthis.fetch()this.test=res},fetch(){asdasd=1//璧嬪€艰繖閲岀粰鏈畾涔夌殑鍙橀噺璧嬪€艰偗瀹氫細鎶ラ敊鏂规硶涓殑閿欒浠ユ煡鐪嬫晥鏋滐細Test.......doSomeThing(){aaaaaaaa=111111//灏嗗€艰祴缁欐湭瀹氫箟鐨勮繖閲岀殑variable鑲畾浼氭姤閿檥锛岃矊浼间簨浠朵篃鑳芥甯告崟鑾凤紝鎴戜滑鍐嶈瘯璇曞啓涓€涓粍浠讹紝鍦ㄧ粍浠堕噷鑷畾涔変竴涓簨浠讹紝鐪嬬湅缁撴灉锛?my-custom-comp@node-click="doSomeThing"/>//缁勪欢涓殑$emit瑙﹀彂锛歵his.$emit('node-click',item)杩欎釜寮傚父杩樻槸鎴愬姛鎹曡幏鐨勶紝褰撶劧lifecyclehook涓殑error寮傚父涔熸槸All鍙互鎴愬姛鎹曡幏锛屾墍浠ユ垜涓嶄細鍋氭洿澶氱殑婕旂ず銆傚埌姝や负姝㈡病鏈夐棶棰橈紝浣嗘槸濡傛灉Vue鍐呴儴涓嶆姤閿欐€庝箞鍔烇紵鍧忔寜閽?/buttonton>鍙互鐪嬪埌杩欎釜寮傚父娌℃湁琚垚鍔熸崟鑾枫€傚悓鏍凤紝濡傛灉澶栭儴JS浠g爜鎶ラ敊锛屼篃鏃犳硶鎹曡幏銆備篃灏辨槸璇达紝杩欎釜閽╁瓙鍙兘鎹曡幏涓嶸ue鍏宠仈鐨勪簨浠跺畯浠诲姟涓殑閿欒銆傛崟鑾凤細.......fetch(){returnnewPromise((resolve)=>{setTimeout(()=>{asd=1//寮傛瀹忎换鍔″彂鐢熼敊璇痳esolve({})},1000)})}锛屽鏋淧romise寮傚父娌℃湁琚甯稿鐞嗭紝鍒欎笉浼氳鎹曡幏銆備互涓嬩唬鐮侊紝娉ㄦ剰create娌℃湁浣跨敤await鏉ヨ皟鐢ㄥ紓姝ユ柟娉曪細created(){this.getSomeData();},methods:{asyncgetSomeData(){await(asdasd=1);},},涓嬮潰鎴戜滑涓€涓€瑙e喅杩欎袱绉嶅満鏅笅鐨勯敊璇崟鑾烽棶棰樸€傚鐞咼S涓殑棰濆閿欒锛屾垜浠彲浠ヤ娇鐢˙OM鎻愪緵鐨勫叏灞€閿欒澶勭悊鍑芥暟window.onerror鏉ュ皾璇曟崟鑾凤紝瀹冩帴鏀跺涓弬鏁帮細window.onerror=function(message,source,line,column,error){console.log('Globalcatcherror',message,source,line,column,error)}閿欒鐮侊細badbutton鐜板湪鍙互鎹曡幏鎵€鏈夌殑JS寮傚父閿欒锛屽寘鎷瑂etTimeout瀹弔asks寮傛閿欒涔熻兘琚崟鑾凤紝浣嗘槸鎴戜滑娉ㄦ剰鍒板鐞嗕笉褰撶殑Promise閿欒杩樻槸涓嶈兘琚垚鍔熸崟鑾枫€侾romise閿欒鐨勫鐞嗗弬鑰僔ue涓璭rror.js鐨勪唬鐮併€傚悓姝ヤ换鍔″紓甯告崟鑾锋槸涓€灞倀ry...catch...锛岃繖涔熻В閲婁簡涓轰粈涔圴ue鎹曡幏鐨勯敊璇笉浼氳鍏ㄥ眬鐨剋indow.onerror鍐嶆鎹曡幏锛屽洜涓鸿繖閲屽凡缁忔姏鍑恒€傚紓姝ヤ换鍔$殑寮傚父澶勭悊灏辨槸鍒ゆ柇濡傛灉鏄疨romise锛岀劧鍚庡皢catch鎸囧悜閿欒澶勭悊锛氭垜浠彲浠ユā浠垮啓涓€涓彃浠舵潵澶勭悊Vue瀹炰緥涓柟娉曠殑寮傚父銆俧unctionisPromise(ret){returnret&&typeofret.then==='function'&&typeofret.catch==='function'}consthandleMethods=(instance)=>{if(instance.$options.methods){璁゛ctions=instance.$options.methods||{}for(constkeyinactions){if(Object.hasOwnProperty.call(actions,key)){letfn=actions[key]actions[key]=function(...args){letret=args.length>0锛焒n.apply(this,args):fn.call(this)if(isPromise(ret)&&!ret._handled){ret._handled=true杩斿洖ret銆俢atch((e)=>errorHandler(e,this,`CaughtanunhandledPromiseexception:(Promise/async)`))}}}}}}exportdefault{install:(Vue,options)=>{Vue.mixin({beforeCreate(){this.$route.meta.capture&&handleMethods(this)},})},}鍥犱负閬嶅巻鎵€鏈夋柟娉曞彲鑳戒細瀵艰嚧椤甸潰鎬ц兘鎹熷け锛屾墍浠ヨ繖閲屾垜鍔犱簡涓€涓潯浠讹紝闇€瑕佸湪璺敱涓彧鏈夎缃甿eta鎵嶈兘寮€鍚缁勪欢涓嬫柟娉曠殑棰濆寮傚父鎹曡幏銆傚啀娆″皾璇曚笂闈㈢殑閿欒浠g爜浠ユ煡鐪嬬粨鏋滐細created(){this.getSomeData();},methods:{asyncgetSomeData(){await(asdasd=1);},},鍙互姝e父鎹曡幏锛宼his鏂规硶鐨勫ソ澶勬槸鎴戜滑鍙互浼犲叆鍙戠敓閿欒鐨勫疄渚嬩俊鎭€傚鏋滀笉鎯崇敤杩欎釜鏂规硶锛屾垨鑰呯敤setup鏂规硶浠f浛Vue3涓璷ptions鐨勫啓娉曪紝涔熷彲浠ヤ娇鐢ㄥ叏灞€浜嬩欢鐩戝惉鍣ㄦ潵鎹曡幏锛歸indow.addEventListener('unhandledrejection',(event)=>{console.log('鍏ㄥ眬鎹曡幏鏈鐞嗙殑Promise寮傚父',event)})瀹屾暣浠g爜errorPlugin.jsfunctionerrorHandler(err,vm,info){console.log('vueexceptionerrorcapture:','errorinformation'+info)//TODO:澶勭悊閿欒鎶ュ憡}consthandleMethods=(instance)=>{if(instance.$options.methods){letactions=instance.$options.methods||{}for(constkeyinactions){if(Object.hasOwnProperty.call(actions,key)){letfn=actions[key]actions[key]=function(...args){letret=args.length>0锛焒n.apply(this,args):fn.call(this)if(isPromise(ret)&&!ret._handled){ret._handled=truereturnret.catch((e)=>errorHandler(e,this,`鎶撳埌涓€涓湭澶勭悊鐨凱romise寮傚父锛?Promise/async)`))}}}}}}functionisPromise(ret){returnret&&typeofret.then==='function'&&typeofret.catch==='function'}letGlobalError={install:(Vue,options)=>{Vue.config.errorHandler=errorHandler//eslint-disable-next-linemax-paramswindow.onerror=function(message,source,line,column,error){errorHandler(message,null,'鍏ㄥ眬鎹曡幏閿欒')//console.log('鍏ㄥ眬鎹曡幏閿欒',message,source,line,column,error)}window.addEventListener('unhandledrejection',(event)=>{errorHandler(event,null,'鍏ㄥ眬鎹曡幏鏈鐞嗙殑Promise寮傚父')})Vue.mixin({beforeCreate(){this.$route.meta.capture&&handleMethods(this)},})},}exportdefaultGlobalErrorintroducedinmain.jsimportvuefrom'vue'importAppfrom'./App.vue'importrouterfrom'./router'Vue.config.productionTip=false//寮曞叆閿欒澶勭悊鎻掍欢importErrorPluginfrom'./errorPlugin'Vue.use(閿欒鎻掍欢)newVue({router,render:(h)=>h(App),}).$mount('#app')鍦╒ue3涓彲浠ラ€氳繃鍦╩ain.js涓紩鍏ユ彃浠舵潵浣跨敤锛歩mport{createApp}from'vue'浠?./App.vue'瀵煎叆搴旂敤绋嬪簭浠?./router'瀵煎叆璺敱鍣ㄤ粠'./errorPlugin'瀵煎叆閿欒鎻掍欢createApp(App).use(router).use(ErrorPlugin).mount('#app')End濡傛灉闇€瑕佹洿涓板瘜鐨勯敊璇敹闆嗗拰鍒嗘瀽鍔熻兘锛岃繕鏄浣跨敤缁煎悎鎬х殑閿欒璺熻釜鏈嶅姟锛屾瘮濡係entry銆丅ugsnag锛屼絾鏄浉瀵规潵璇达紝杩欎簺閮介渶瑕佸ぇ閲忕殑閰嶇疆鍜岄儴缃叉搷浣滄崟鑾峰紓甯搁敊璇紝鎻愰珮浠g爜鐨勫仴澹€э紝骞朵笖閬垮厤鍦ㄤ唬鐮佷腑鍐欏ぇ閲忕殑寮傚父鎹曡幏鍧楋紝涔熷噺灏戜簡鍑虹幇閿欒鏃舵帶鍒跺彴澶ч噺鐨勭孩鑹插憡璀︺€傞敊璇敹闆嗗彲浠ュ府鍔╂垜浠畾浣嶅紑鍙戞祴璇曢樁娈典笉鏄撳彂鐜扮殑鐤戦毦鏉傜棁锛屽彲浠ラ€氳繃http璇锋眰鍚戞湇鍔″櫒鍙戦€侀敊璇俊鎭€備互涓婂氨鏄枃绔犵殑鍏ㄩ儴鍐呭锛屽笇鏈涘澶у鏈夋墍甯姪锛佽寰楁枃绔犲啓寰楀ソ锛屽彲浠ョ偣璧炴敹钘忋€備篃娆㈣繋鎮ㄥ叧娉ㄣ€傛垜浼氭寔缁洿鏂版洿澶氭湁鐢ㄧ殑鍓嶇鐭ヨ瘑鍜屽疄鐢ㄦ妧宸с€備竴鏃ヨ尪鏃犲懗锛屾効涓庝綘鍏卞悓鎴愰暱~