异步错误处理 -- 时机
生活随笔
收集整理的這篇文章主要介紹了
异步错误处理 -- 时机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、編寫JavaScript代碼時,我們要時刻牢記,JavaScript引擎是一個事件驅動的執行引擎,代碼總是以單線程執行,
而回調函數的執行需要等到下一個滿足條件的事件出現后,才會被執行。
例如,setTimeout()函數可以傳入回調函數,并在指定若干毫秒后執行:
function printTime() {console.log('It is time!'); }setTimeout(printTime, 1000); console.log('done');// 上面的代碼會先打印done,1秒后才會打印It is time!。2、如果printTime()函數內部發生了錯誤,我們試圖用try包裹setTimeout()是無效的
function printTime() {throw new Error(); }try {setTimeout(printTime, 1000);console.log('done'); } catch (e) {console.log('error'); }//不會捕捉到異常,JS引擎報錯// VM3520:5 Uncaught Error at printTime (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:5:11)
原因就在于調用setTimeout()函數時,傳入的printTime函數并未立刻執行!
緊接著,JavaScript引擎會繼續執行console.log('done');語句,而此時并沒有錯誤發生。
直到1秒鐘后,執行printTime函數時才發生錯誤,但此時除了在printTime函數內部捕獲錯誤外,外層代碼并無法捕獲。
所以,涉及到異步代碼,無法在調用時捕獲,原因就是在捕獲的當時,回調函數并未執行。
3、類似的,當我們處理一個事件時,在綁定事件的代碼處,無法捕獲事件處理函數的錯誤。
<form><input id="x"> + <input id="y"><button id="calc" type="button">計算</button> </form>try {$btn.click(function () {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('輸入有誤');}r = x + y;alert('計算結果:' + r);}); } catch (e) {alert('輸入有誤!'); }// VM3523:16 Uncaught Error: 輸入有誤
// at HTMLButtonElement.eval (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:16:19)
// at HTMLButtonElement.dispatch (jquery.js:3)
// at HTMLButtonElement.r.handle (jquery.js:3)
修改代碼如下:
$btn.click(function () {try {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('輸入有誤');}r = x + y;alert('計算結果:' + r);} catch (e) {alert('輸入有誤!');}});?
轉自:https://www.liaoxuefeng.com/wiki/1022910821149312/1120880431288064
轉載于:https://www.cnblogs.com/slightFly/p/11576971.html
總結
以上是生活随笔為你收集整理的异步错误处理 -- 时机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误传播 --try{}catch(e)
- 下一篇: Atcoder Educational