【问题标题】:Pass error reason in thrown object / How to handle errors in modern JavaScript [closed]在抛出的对象中传递错误原因/如何处理现代 JavaScript 中的错误 [关闭]
【发布时间】:2013-06-11 16:57:14
【问题描述】:

我正在开发一个包含解析器的小型 Node.js 包。一旦检测到不可恢复的问题,它就会抛出。

我使用 Java 已经有好几年了,我已经习惯了大量的异常类。

但这是 JavaScript。我想这是风格问题。我的基本问题是如何传递错误原因来捕获块。我想为不同的错误原因创建不同的错误“类”,每个都处理每个问题的详细信息,或者创建一个将原因作为属性的错误类。

让我举一个处理这两种错误的例子:

catch(e) {
  if(e instanceof FirstError) {
    ...
  }
  if(e instanceof SecondError) {
    ...
  }
}

catch(err) {
  if(err instanceof AnError) {
    if(err.detail === 'becauseOfA') {
      ...
    }
    if(err.detail === 'becauseOfB') {
      ...
    }
  }
  ...
}

哪种方法更好?两者都可以,但我不喜欢第一个。在我看来,许多课程都是巨大的开销。

编辑:
我同意使用回调(也回答了here):

// One class per error type
function(err, ast) {
  if(err) {
    if(err instanceof FirstError) {
      ...
    }
    if(err instanceof SecondError) {
      ...
    }
  }
  ...
}

// One class for all errors
function(err, ast) {
  if(err) {
    if(err instanceof AnError) {
      if(err.detail === 'becauseOfA') {
        ...
      }
      if(err.detail === 'becauseOfB') {
        ...
      }
    }
    ...
  }
}

// No class at all
function(err, ast) {
  if(err) {
    if(err.detail === 'becauseOfA') {
      ...
    }
    if(err.detail === 'becauseOfB') {
      ...
    }
    ...
  }
}

问题仍然存在:我应该删除所有类并使用没有任何原型继承的简单对象吗?我需要将有关问题的信息传递给错误处理程序(无论是捕获还是回调)。

我想让这个函数保持同步,因为它很小而且很快(是的,我知道回调不会使函数异步)。 AFAIK Node.js 本身在同步代码 (fs.readFileSync) 中引发错误,同时将错误对象传递给异步函数 (fs.readFile) 中的回调。

【问题讨论】:

  • +1 用于===。我更喜欢第一个版本,尽管我从不在 Javascript 中使用 try-catches。
  • +1 为案例。我也想知道 js 中最好的方法是什么。
  • 我很惊讶,来自 Java 的你不愿意使用很多类 :) 但真的那么长吗:var ExceptionTypeA = function(){};
  • @YaK 我想遵循 this 错误类的约定。在 Java 中,我有点沉迷于类,而在 JS 中,我更喜欢对象属性而不是带有构造函数、getter 和 setter 的类:)

标签: javascript node.js exception exception-handling try-catch


【解决方案1】:

我认为,node 的最佳方法是以回调样式重写您的模块。虽然您应该向回调传递两个参数:第一个是错误或 null(如果操作成功完成),第二个是操作结果(或 null 或未定义,如果发生错误)。

您可以在回调中简单地处理它们。您可以将错误作为字符串传递,然后只使用 case(error) 来处理不同的情况。

UPD:

对于同步方法,您可以使用 throws,但您也可以只抛出字符串然后切换它们。如果您想对错误进行分类(例如,如果方法可能会抛出非常不同的错误(在 Java 代码中它们可能在不同的类中描述),您可以使用如下所示的对象:{ error: 'error_name', type: 'error_type ' }。

然后是switch(err.type),switch(err.error)。

在 Javascript 中为此使用类并不是最好的方法,因为它只是创建具有原型属性的对象,指向构造函数对象,然后 instaceof 比较该指针。

【讨论】:

  • 谢谢!所以我会删除所有错误类并将问题传递给回调,对吗? node.js 本身不会将错误对象(错误实例)传递给回调吗?这是非异步函数的最佳方法吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 2010-12-07
  • 2022-07-25
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多