首页 存档 技术 查看内容

JavaScript 错误处理和堆栈追踪浅析

2018-3-30 13:00 |来自: 互联网 317 0

摘要: * 作者:dwqs * 本文转载自:github.com/dwqs/blog/issues/49 本文读完需 3 分钟,耐心看完! 本文属于技术升级篇,适合有基础的学员阅读。 有时我们会忽略错误处理和堆栈追踪的一些细节, 但是这些细节对于写与测试 ...

* 作者:dwqs

* 本文转载自:github.com/dwqs/blog/issues/49

本文读完需 3 分钟,耐心看完!

本文属于技术升级篇,适合有基础的学员阅读。


有时我们会忽略错误处理和堆栈追踪的一些细节, 但是这些细节对于写与测试或错误处理相关的库来说是非常有用的. 例如这周, 对于 Chai 就有一个非常棒的PR, 该PR极大地改善了我们处理堆栈的方式, 当用户的断言失败的时候, 我们会给予更多的提示信息(帮助用户进行定位).


合理地处理堆栈信息能使你清除无用的数据, 而只专注于有用的数据. 同时, 当更好地理解 Errors 对象及其相关属性之后, 能有助于你更充分地利用 Errors.

1(函数的)调用栈是怎么工作的


在谈论错误之前, 先要了解下(函数的)调用栈的原理:


当有一个函数被调用的时候, 它就被压入到堆栈的顶部, 该函数运行完成之后, 又会从堆栈的顶部被移除.


堆栈的数据结构就是后进先出, 以 LIFO (last in, first out) 著称.


例如:


functionc(){

console.log('c');

}

functionb(){

console.log('b');

c();

}

functiona(){

console.log('a');

b();

}

a();


在上述的示例中, 当函数 a 运行时, 其会被添加到堆栈的顶部. 然后, 当函数 b 在函数 a 的内部被调用时, 函数 b 会被压入到堆栈的顶部. 当函数 c 在函数 b 的内部被调用时也会被压入到堆栈的顶部.


当函数 c 运行时, 堆栈中就包含了 a, b 和 c(按此顺序).


当函数 c 运行完毕之后, 就会从堆栈的顶部被移除, 然后函数调用的控制流就回到函数 b. 函数 b 运行完之后, 也会从堆栈的顶部被移除, 然后函数调用的控制流就回到函数 a. 最后, 函数 a 运行完成之后也会从堆栈的顶部被移除.


为了更好地在demo中演示堆栈的行为, 可以使用 console.trace() 在控制台输出当前的堆栈数据. 同时, 你要以从上至下的顺序阅读输出的堆栈数据.


functionc(){

console.log('c');

console.trace();

}

functionb(){

console.log('b');

c();

}

functiona(){

console.log('a');

b();

}

a();


在 Node 的 REPL 模式中运行上述代码会得到如下输出:


Trace

atc(repl:3:9)

atb(repl:3:1)

ata(repl:3:1)

atrepl:1:1//

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部