电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解JavaScript錯誤捕獲

瀏覽:6日期:2023-10-02 17:23:41
一、基本使用與邏輯

使用

try{ //code....}catch(err){ //error handling}finally{ //no matter what happens in the try/catch (error or no error), this code in the finally statement should run. }

邏輯

詳解JavaScript錯誤捕獲

二、特性

try...catch 僅適用于運行時錯誤,解釋階段錯誤無法正常工作

try{ {{{{{{{}catch(err){ console.error(err)}//引擎在‘parse-time’出錯,導致無法理解代碼,因此無法捕捉

try...catch 只能同步工作

try{ setTimeout(function(){undefinedVariable; },1000)}catch(err){ console.error(err)}//setTimeout的回調函數執行時,引擎已經離開try...catch結構

finally 能讓try塊中的return語句失效

function test(){ try { return 1; } catch(error) { return 2; } finally { return 3; }}console.log(test());//3三、錯誤對象

當程序發生error,js內部會生成一個包含error細節的對象,該對象會被作為參數傳進catch

對于所有內置錯誤,錯誤對象具有兩個主要屬性

name 錯誤類型 message 文本類型的錯誤信息 stack (非標準屬性)發生錯誤時的調用棧信息,主要用于調試

try { lalala; // error, variable is not defined!} catch (err) { alert(err.name); // ReferenceError alert(err.message); // lalala is not defined alert(err.stack); // ReferenceError: lalala is not defined at (...call stack) // Can also show an error as a whole // The error is converted to string as 'name: message' alert(err); // ReferenceError: lalala is not defined}

理論上,我們可以throw任何東西作為錯誤對象,但最好的習慣是throw一個具有name,message的對象,以便和內置錯誤對象保持兼容

番外:內置的錯誤對象

對象 含義 ReferenceError 引用未定義變量時觸發 SyntaxError 使用不合法的語法結構時觸發 TypeError 值得類型非預期時觸發 URIError 錯誤使用全局URI函數如encodeURI()、decodeURI()等時觸發 RangeError 對Array構造函數使用錯誤的長度值,對Number.toExponential()、Number.toFixed()或Number.toPrecision()使用無效數字等 EvalError 全局函數eval()中發生的錯誤 四、較好的catch和throw策略

​ catch錯誤不單單是為了防止程序掛掉,更重要的目的是方便調試,找bug,所以對錯誤的處理策略,稍微可以體現出碼者的優雅性

​ 俗話說的好,碼者,人恒雅也,盡量遵循一個原則,catch只處理自己知道的錯誤

舉個梨子

let json = ’{ 'age': 30 }’; try{ let user = JSON.parse(json); alert( user.name );} catch (err) { console.error(’JSON Error:’+err);}

上述例子的catch策略能保證程序正常,因為catch塊能catch內部所有的錯誤,無論是JSON.parse出錯還是user.name不存在報錯,都能被catch到,但兩種錯誤都用同一種打印是不利于調試的,寫成下面這樣會好一點

let json = ’{'age':30}’try{ let user = JSON.parse(json); alert(user.name)}catch(err){ if(err instanceof SyntaxError){ console.error(’JSON Error:’+err); } else throw err;}

每個catch塊處理自己知道得,可能會出現得錯誤,就是說,編程人員在編程的時候,catch那些預料到的錯誤,而將可能自己沒料到的錯誤拋到外面。

五、Promise的錯誤處理

​ 眾所周知,Promise是會吞掉error的,因為promise的實現就在內部對所有error進行了捕獲,且捕獲到的error不是向外拋出(外指promise之外),而是沿著鏈找到最近的onreject回調傳入,所以promise的錯誤處理只有兩種辦法

設置onreject回調 全局捕獲

舉個栗子

try{ new Promise((resolve,reject)=>{throw new Error(’promise error’) }).catch(()=>{//錯誤在最近的onreject回調被捕獲console.error(err); })}catch(err){ //永遠不會執行,promise吞掉error console.error(err);}

另外需要注意,無論是執行者函數(executor)和還是 promise 的處理程序(handler),內部發生的錯誤統統吞掉,相當于被隱式catch,error會自動找到最近的onreject回調傳進去

try{ new Promise((resolve,reject)=>{resolve(); }).then(()=>{throw new Error(’promise then error’); }).catch((err){console.error(err); })}catch(err){ //地球毀滅之前都不會執行 console.error(err)}

同理,在錯誤找到onreject傳進去之前,經過的then注冊的onfulfilled回調統統失效,直到找到onreject回調,處理之后,onreject回調之后的onfulfilled回調才正常

try { new Promise((resolve, reject) => {throw new Error(’promise error’) }).then((ret) => {//錯誤沒有處理,失效console.log(’then1:’ + ret) }).catch((err) => {//錯誤處理了,后序正常console.error(err);return ’handled’ }).then((ret) => {//正常執行console.log(’then2’ + ret); })} catch (err) { //同樣的,人類毀滅之前都不會執行 console.error(err)}// Error:promise error//then2handled

那整條鏈一個catch都沒設置會怎么樣呢?

那這個error就會擊穿地心,一直穿透到全局,根據宿主環境的不同觸發不同的全局事件,比如說瀏覽器中會觸發 unhandledrejection事件,node環境中也會觸發unhandledRejection事件,一般會對這事件進行監聽,再顯示信息給編程人員或者用戶

番外1:chromium / v8 / v8 / 3.29.45 的 Promise內部錯誤捕捉

詳解JavaScript錯誤捕獲

番外2:async/await錯誤捕捉

六、性能損耗​

After V8 version 6 (shipped with Node 8.3 and latest Chrome), the performance of code inside try-catch is the same as that of normal code. ------ 爆棧網

(稍微測了一下,相差無幾)

以上就是詳解JavaScript錯誤捕獲的詳細內容,更多關于JavaScript 錯誤捕獲的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 上海logo设计| 温州在线网| 都江堰招聘网-都江堰人才网 都江堰人事人才网 都江堰人才招聘网 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 | 纸张环压仪-纸张平滑度仪-杭州纸邦自动化技术有限公司 | 99文库_实习生实用的范文资料文库站| 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 万家财经_财经新闻_在线财经资讯网| 客服外包专业服务商_客服外包中心_网萌科技 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 岩棉切条机厂家_玻璃棉裁条机_水泥基保温板设备-廊坊鹏恒机械 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 宝鸡市人民医院| 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 电车线(用于供电给电车的输电线路)-百科 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 首页 - 张店继勇软件开发工作室| 广东之窗网| 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 东莞海恒试验仪器设备有限公司 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 |