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

    1. function getLength(s) {
    2. return s.length;
    3. }
    4. function printLength() {
    5. console.log(getLength('abc')); // 3
    6. console.log(getLength(null)); // Error!
    7. }
    8. printLength();

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

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

    1. function main(s) {
    2. console.log('BEGIN main()');
    3. try {
    4. foo(s);
    5. } catch (e) {
    6. console.log('出错了:' + e);
    7. }
    8. console.log('END main()');
    9. }
    10. function foo(s) {
    11. console.log('BEGIN foo()');
    12. bar(s);
    13. console.log('END foo()');
    14. }
    15. function bar(s) {
    16. console.log('BEGIN bar()');
    17. console.log('length = ' + s.length);
    18. console.log('END bar()');
    19. }
    20. main(null);

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

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