首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在抛出对象中传递错误原因/如何在现代JavaScript中处理错误

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

Stack Overflow用户
提问于 2013-06-14 23:30:50
回答 1查看 1.9K关注 0票数 10

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

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

但这是JavaScript。我想这是风格的问题。我的基本问题是如何传递捕获块的错误原因。我想要创建不同的错误“类”,因为不同的错误原因,每个错误都考虑每个问题的细节,或者一个错误类,其中包含一个属性的原因。

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

代码语言: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):

代码语言:javascript
复制
// 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') {
      ...
    }
    ...
  }
}

问题依然存在:我是否应该删除所有类,使用一个简单的对象,而不使用任何原型继承?我需要将有关问题的信息传递给错误处理程序(无论是catch还是回调)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-15 04:33:29

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

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

UPD:

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17118711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档