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: 你错了! 捕获到了错误
所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。