在抛出的对象中传递错误原因/如何处理现代JavaScript中的错误

Pass error reason in thrown object / How to handle errors in modern JavaScript

本文关键字:错误 何处理 JavaScript 处理 对象      更新时间:2023-09-26

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

我已经使用Java很多年了,我已经习惯了大量的异常类。

但这是JavaScript。我想这是风格的问题。我的主要问题是如何传递错误原因来捕获块。我想为不同的错误原因创建不同的Error"类",每个类负责每个问题的细节,或者创建一个单独的Error类,将原因作为属性。

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

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

我认为,node最好的方法是用回调风格重写模块。虽然应该给回调函数传递两个参数:第一个是error或null(如果操作成功完成),第二个是操作的结果(如果发生错误,则为null或undefined)。

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

乌利希期刊指南:

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

然后切换(err.type),切换(err.error)。

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