首页 > 解决方案 > 扩展 Error 对象时是否需要 super(originalError)?

问题描述

扩展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),但我仍然犹豫是否要删除它。

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

标签: javascriptnode.jsloggingecmascript-6error-handling

解决方案


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

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

是的。class一个extends另一个定义一个自定义constructor 必须调用super()来创建实例


推荐阅读