10

我正在开发一个包含解析器的小型 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') {
      ...
    }
  }
  ...
}

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

编辑:
我同意使用回调(也在这里回答):

// 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) 中的回调。

4

1 回答 1

1

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

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

升级版:

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

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

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

于 2013-06-15T04:33:29.360 回答