【前端入门】错误处理的深入探讨:错误传播与异步错误处理

102 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

错误传播

如果代码发生了错误,又没有被try ... catch捕获,那么,程序执行流程会跳转到哪呢?

function getLength(s) {
    return s.length;
}

function printLength() {
    console.log(getLength('abc')); // 3
    console.log(getLength(null)); // Error!
}

printLength();

如果在一个函数内部发生了错误,它自身没有捕获,错误就会被抛到外层调用函数,如果外层函数也没有捕获,该错误会一直沿着函数调用链向上抛出,直到最后捕获,代码终止执行。

其实我们不必在每一个函数内部捕获错误,只需要在合适的地方来个统一捕获(还是用上次分享的try ... catch语句)

异步错误处理

JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。

如果编写的一个函数内部发生了错误,我们试图用try包裹函数内部问题是无效的,这也是导致为什么很多情况下无法发现问题!

例如:

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

setTimeout(printTime, 1000);
console.log('done');

function printTime() {
    throw new Error();
}

try {
    setTimeout(printTime, 1000);
    console.log('done');
} catch (e) {
    console.log('error');
}

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

写在最后

以上习题&笔记从大佬们的论坛学习而来,特感谢大佬们的知识分享~ (学习技术知识,果然要看大佬们的技术博客,大家有好的推荐也欢迎指引我这个小白哈,感恩!)

附上学习链接,感谢廖大神例题及分析参考 : www.liaoxuefeng.com/wiki/102291…

www.liaoxuefeng.com/wiki/102291…