【五十】错误传播

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

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

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

printLength();

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

所以,我们不必在每一个函数内部捕获错误,只需要在合适的地方来个统一捕获,一网打尽:

function main(s) {
    console.log('BEGIN main()');
    try {
        foo (s);
    } catch (e) {
        alert('出错了: ' + e);
    }
    console.log('END main()');
}

function foo(s) {
    console.log('BEGIN foo()');
    bar(s);
    console.log('END foo()');
}

function bar(s) {
    console.log('BEGIN bar()');
    console.log('length = ' + s.length);
    console.log('END bar()');
}

main(null);

执行之后:

会有弹窗提示
控制台输出

bar()函数传入参数null时,代码会报错,错误会向上抛给调用方foo()函数,foo()函数没有try ... catcht语句,所以错误继续向上抛给调用方main()函数,main()函数有try ... catch 语句,所以错误最终在main()函数被处理了。

至于在哪些地方捕获错误比较合适,需要视情况而定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 安生,很少人能融入她的生活,但她对融入的人异常珍惜。外冷内热,保持一颗真诚之心,在世事中变得成熟。 七月,表面的乖...
    温妮小世界阅读 431评论 0 0
  • _JiaNan_阅读 238评论 0 1
  • 黄昏的时分,站在街口。 看着雪花在空中飞舞着,一会儿又盈盈落下,白了一地,而后又不见了。 街边...
    哈尔滨王海军阅读 459评论 0 0