53、JavaScript 错误传播

如果代码发生了错误,又没有被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. 'use strict';
  2. function main(s) {
  3. console.log('BEGIN main()');
  4. try {
  5. foo(s);
  6. catch (e) {
  7. alert('出错了:' + e);
  8. }
  9. console.log('END main()');
  10. }
  11. function foo(s) {
  12. console.log('BEGIN foo()');
  13. bar(s);
  14. console.log('END foo()');
  15. }
  16. function bar(s) {
  17. console.log('BEGIN bar()');
  18. console.log('length = ' + s.length);
  19. console.log('END bar()');
  20. }
  21. main(null);
  22. // 直接运行,观察控制台输出

 

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

 

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

 

JavaScript 错误传播

付杰
  • ¥ 15元
  • 市场价:15元
  • ¥ 1999.9元
  • 市场价:20000元
  • ¥ 298.0元
  • 市场价:398.0元
  • ¥ 89.0元
  • 市场价:129.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: