在JavaScript中使用自定义错误而不仅仅是字符串的好理由是什么?

在JavaScript中使用自定义错误而不仅仅是字符串的好理由是什么?,javascript,Javascript,通常,当我想编写自定义异常时,这是因为我想以优雅的方式触发、捕获和处理已知条件。是否有任何不利因素可以避免所有仪式,只需执行以下操作: const ERROR_OOPS = "oops" try { throw ERROR_OOPS; } catch (error) { if (error === ERROR_OOPS) { // handle oops case return; } // handle other err

通常,当我想编写自定义异常时,这是因为我想以优雅的方式触发、捕获和处理已知条件。是否有任何不利因素可以避免所有仪式,只需执行以下操作:

const ERROR_OOPS = "oops"

try {

    throw ERROR_OOPS;

} catch (error) {

    if (error === ERROR_OOPS) {
        // handle oops case
        return;
    }

    // handle other errors
}

两个可能会考虑自定义错误的场合:

  • 您需要附加有关错误的元信息。正如@amn所提到的,您可以只抛出一个带有负载的文本对象,但是在catch块中识别错误类型会变得很困难
  • 您有许多地方抛出自定义错误,出于调试目的,您希望从抛出自定义错误的地方执行深层堆栈跟踪

  • 你的问题涉及多个方面。诚然,这都是错误处理的一部分,但它涉及到错误的传递方式(
    返回
    vs
    抛出
    ),对象类型错误(
    错误
    ,错误的自定义子类,字符串/非错误对象)以及可能的其他方面。你的问题总是涉及到意见的回答。我的观点是,只要代码可读,这并不重要。也就是说,我更喜欢使用异常,从不返回错误。您也很少需要记录错误,通常是捕获错误的一部分,否则会自动记录错误。如果您只是抛出一个字符串作为错误消息,那么这就是您所需要的,但自定义错误对象允许您附加更多信息。与必须使用if-else链捕获错误对象和您自己的字符串相比,执行
    切换(typeof error)
    来处理多个错误也更为简洁。
    typeof error
    不会返回它们实际的错误类,它将生成
    “object”
    。您可以执行
    开关(error.constructor)
    ,但它有自己的问题。另外,如果您想附加信息,抛出一个用文本(
    {…}
    )定义的对象也可以。这就是为什么我说只要代码被他们的同龄人理解就没有多大关系。如果你上面发布的内容不是对你的问题的回答——我也不完全确定是否是——那么我建议你将内容整合到问题中。至于您所说的,对象文字根本不会让识别错误变得棘手,您完全可以
    切换
    错误对象属性。无论你抛出什么
    ,都几乎可以保证它是一个对象。堆栈跟踪可用于大多数JavaScript运行时,至少在运行调试器时是如此。