【问题标题】:Inner Errors (exceptions) in JavaScriptJavaScript 中的内部错误(异常)
【发布时间】:2014-12-25 17:24:45
【问题描述】:

在 JavaScript 中引发异常时,是否有首选方法来包含内部异常?

我对来自 C# 背景的 JavaScript 比较陌生。在 C# 中,您可以执行以下操作:

try 
{
  // Do stuff
}
catch (Exception ex)
{
  throw new Exception("This is a more detailed message.", ex);
}

在我在 JavaScript 中看到的示例中,我无法找到如何在仍然传递原始异常的同时捕获异常、添加新消息以及重新引发新异常。

【问题讨论】:

  • 您可以在javascript中定义自己的异常:stackoverflow.com/a/464500/1291428。然后,这个概念在某种程度上是一个全球标准:例外应该适合谁正在使用您的 api。因此,这意味着在必要时捕获它,添加以下信息,记录原始异常等。请参阅 Joshua Bloch,Effective Java 2nd Edition,第 61 条:抛出适合抽象的异常
  • 我明白了。我认为可能有一种通常可以处理这种情况的方法,以使 API 的使用者更容易。我可能会在自定义异常中添加一个名为 innerException 的字段。谢谢!
  • throw 显示了一个堆栈,因此您应该能够准确追踪问题所在。也就是说,stack 不是标准属性,尽管它以一些稍微不同的格式被广泛实现。

标签: javascript error-handling


【解决方案1】:

你可以扔任何你想要的东西:

try {
    var x = 1/0; 
}
catch (e) {
    throw new MyException("There is no joy in Mudville", e);
}

function MyException(text, internal_exception) {
    this.text = text;
    this.internal_exception = internal_exception;
}

然后将抛出类型为MyException 的错误,其属性为textinternal_exception

【讨论】:

  • 我这样做除了“text”和“internalError”之外,我还有一个动态属性“data”,一个我记录各种信息的对象,有时与生成的输入有关错误。我这样做是为了更容易和更详细​​的调试。
  • 抛出 any 对象是个坏主意,因为(据我所知)只有 Error 类型可用于正确获取 @ 987654326@/stackTrace 在第一个投掷点。因此,与其使用function MyException,不如使用class MyError extends Error
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2010-09-10
  • 2020-06-27
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多