自定义Error子类未传参给super,为何仍能获取err.stack?
为什么自定义Error类没给super传参,stack依然正常工作?
这个问题其实涉及到JavaScript引擎处理错误调用栈的底层逻辑,咱们一步步拆解:
1. 调用栈stack是引擎自动生成的,和构造函数参数无关
当你抛出一个Error实例(包括你自定义的MyError子类实例)时,JavaScript引擎会在错误被创建或抛出的瞬间,自动捕获当前的代码执行调用栈,然后把这个信息赋值给错误对象的stack属性。这个过程完全是引擎在后台完成的,不需要依赖你给Error构造函数传任何参数。
哪怕你调用super()时什么都不传,只要这个实例是Error的子类,引擎就会自动为它生成调用栈信息。
2. super()的参数影响的是message属性,而非stack
你调用super()没传参数,只会影响错误对象的message属性:默认情况下,this.message会是空字符串,或者在某些引擎里显示为"Error"。但这和stack的生成没有关系——stack记录的是代码执行的路径,和错误消息内容无关。
比如你可以在catch块里打印err.message,会发现它是空的,但err.stack依然会清晰显示从哪里抛出的错误、调用链是怎样的。
小提示:最佳实践还是要给super传message
虽然现在stack能正常工作,但建议你把message传给super,也就是写成:
super(message);
这样做的好处是:
- 错误对象的
message属性会被正确设置为你传入的内容 stack的第一行也会显示更清晰的错误信息(比如MyError: greater than 6),方便调试
内容的提问来源于stack exchange,提问作者coool
相关产品推荐
相关产品推荐

