【问题标题】:Is super(originalError) necessary when extending the Error object?扩展 Error 对象时是否需要 super(originalError)?
【发布时间】:2019-02-17 12:53:14
【问题描述】:

在扩展Error 对象时,我很沮丧调用super(originalError) 会导致将正常的堆栈跟踪打印到STDOUT。我希望我的日志以 JSON 格式进行格式化,以便它们可以被 logstash/Kibana 使用。 Kibana 中包含\n 的堆栈跟踪被拆分为多个条目,因为它显然不知道如何处理该输入。我可以在登录之前通过一些修改来避免这种情况

function logError(errorDetails, stack) {
  logger.error({ errorDetails, stack: sanitizeLineBreaks(stack) } // removes `\n`
}

但是我正在实现的错误对象看起来像:

class ServerError extends Error {
  constructor(originalError, errorDetails, stack) {
    super(originalError) // <- this is the problem
    Error.captureStackTrace(this, ServerError)
    // stuff ...
    logError(originalError, stack)
  }
}

但是,调用super(originalError) 会使用换行符打印到控制台;这会导致丑陋的条目,其中跟踪的每一行都是 Kibana GUI 中的单独条目。当我致电super(originalError) 时,我在控制台中没有收到任何投诉,但我仍然犹豫是否要删除它。

扩展Error对象时是否需要super(originalError)

【问题讨论】:

  • super() 没有向控制台打印任何内容?!它只是创建Error 实例。或者您的环境中是否有一个覆盖的 Error 构造函数?
  • @Bergi However calling super(originalError) prints to the console with new line characters 好像我在某个地方被误导了。你能指出是什么让你认为它没有打印任何东西吗?
  • @Bergi 嗯,我并不完全关注。 Super(originalError) 确实在我的情况下打印到控制台。
  • @Bergi 我只有extend Error,不要覆盖它。
  • 你能展示一个完整的程序来重现这个问题吗?创建 new Error(…) 不会在我的节点中的控制台上打印任何内容 - 除非您执行 console.log(new Error(…))

标签: javascript node.js logging ecmascript-6 error-handling


【解决方案1】:

(忽略您的日志记录问题)

扩展Error对象时是否需要super(originalError)

是的。 Every class that extends another and defines a custom constructor must call super() to create the instance.

【讨论】:

  • 这确实回答了这个问题,所以谢谢。您知道是否有任何方法可以抑制它打印错误堆栈?
  • 调用Error 构造函数不应该在任何地方打印任何东西。请在您的问题中创建minimal reproducible example
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 2021-07-04
  • 1970-01-01
  • 2023-04-04
  • 2014-09-16
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多