异步处理出现的错误原因和解决方法

JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。

function printTime() {
    console.log('It is time!');
}

setTimeout(printTime, 1000);  // setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行
console.log('done');
// 运行结果 done    It is time!  中间隔了1s时间

如果printTime()函数内部发生了错误,我们试图用try包裹setTimeout()是无效的。原因就在于调用setTimeout()函数时,传入的printTime函数并未立刻执行!紧接着,JavaScript引擎会继续执行console.log('done');语句,而此时并没有错误发生。直到1秒钟后,执行printTime函数时才发生错误,但此时除了在printTime函数内部捕获错误外,外层代码并无法捕获。

'use strict';

function printTime() {
    throw new Error('你错了!');
}

try {
    setTimeout(printTime, 1000);
    console.log('done');
} catch (e) {
    console.log('error:',e);
}
//运行结果 done  并没有显式error: Error:你错了!

/*
给setTImeout加try-catch捕获的是setTimeout的错误,并不能捕获参数函数的错误。
如果要捕获printTime的错误,在printTime内try-catch,或者用函数封装。
总之就是哪里出错哪里才能try-catch捕获。!!!!
异步执行代码一定关注哪个函数内部会出现错误就在那个函数内部进行try-catch-finally包围来在内部捕获错误。
*/
setTimeout(function(){

    try{

        printTime();
        console.log('done');
    }catch(e){

        console.log('error:',e);

    }

}, 1000);
// 输出 error: Error: 你错了! 捕获到了错误

所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值