【问题标题】:How to throw an exception with a status code?JS:如何用状态码抛出 Error()? [关闭]
【发布时间】:2021-11-08 22:27:37
【问题描述】:

如何抛出带有选项或状态码的错误然后捕获它们?

从语法here 看来,我们可以通过附加信息解决错误:

new Error(message, options)

那么,我们可以像下面这样扔吗?

throw new Error('New error message', { statusCode: 404 })

那么,我们如何才能捕捉到statusCode

try {
 //...
} catch (e) {
  console.log(e.statusCode) // not working off course!
}

有什么想法吗?

编辑:

选项是not supported

我的解决方法是重新抛出错误:

try {
  const found = ...

  // Throw a 404 error if the page is not found.
  if (found === undefined) {
    throw new Error('Page not found')
  }

} catch (error) {
  // Re-throw the error with a status code.
  error.statusCode = 404
  throw error
}

不是一个优雅的解决方案。

【问题讨论】:

  • "从这里的语法来看,我们似乎可以通过附加信息来解决错误:" 然后页面描述了 options 的外观。它可以包含cause
  • 为什么你需要专门抛出Error而不是其他任何东西?
  • 要么创建一个带有第二个参数的自定义错误子类,要么使用throw Object.assign(new Error('New error message'), { statusCode: 404 });
  • "尚不支持选项。" 1. 实际上只有一个选项可以使用。不是任意选项。 2. 支持该选项,但仅在最新的 Chrome/FF/Safari caniuse.com/…
  • "我的解决办法是重新抛出错误:" 为什么?这比使用try/catch 作为控制流更糟糕。因为没有控制,它是线性的。为什么不创建错误,添加属性 then throw 它,而不是 create -> throw -> add property -> rethrow?我不明白你想在这里发生什么。您到底在寻找什么解决方案,为什么这一切都如此丰富?

标签: javascript error-handling try-catch throw


【解决方案1】:

你可以使用err.code

const error = new Error("message")
error.code = "YOUR_STATUS_CODE"
throw error;

【讨论】:

  • 我也想过。我正在尝试减少这 3 行以使其更短。
【解决方案2】:

here 所述,您必须为此创建一个自定义异常:

function CustomException(message) {
  const error = new Error(message);

  error.code = "THIS_IS_A_CUSTOM_ERROR_CODE";
  return error;
}

CustomException.prototype = Object.create(Error.prototype);

然后你可以抛出你的自定义异常:

throw new CustomException('Exception message');

【讨论】:

  • 原型根本不用,为什么还要设置?
  • 但是不要那样做。要么使用返回具有自定义属性的 Error 实例的工厂函数(没有 new!),使用 classextends Error 并将其与 new 一起使用。跨度>
  • 我已经看到了。谢谢。我正在尝试减少自定义错误。但我认为尚不支持内部选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多