1

例如,我有不同的错误组,MyErrorGroupFoo并且MyErrorGroupBar我希望在我的错误处理程序中以不同的方式处理这些错误,但我还想在错误消息中提供其他信息。问题是我区分错误,error.message所以如果我想处理两种不同类型的错误,我必须有两条这样的错误消息

throw new Error('MyErrorGroupFoo') 

或者

throw new Error('MyErrorGroupBar')

,但是如果我想在错误消息中提供详细信息,我必须有多种类型的错误消息,实际上几乎所有的错误消息都会像这样不同

throw new Error('Wrong Foo, foo =', foo)

或者

throw new Error('Wrong Bar, bar =', bar)

我怎么不能实现处理不同组错误的目标,可能(最常见)特定组中的不同错误消息?

现在我只需将 JSON 放入这样的错误消息中即可

throw new Error(JSON.stringify({
  what: 'MyErrorGroupFoo',
  why: 'Wrong Foo, foo =', foo
}) 

或者

throw new Error(JSON.stringify({
  what: 'MyErrorGroupBar',
  why: 'Wrong Bar, bar =', bar
}) 

当我发现错误时,我会根据属性解析error.message并决定下一步该做什么。what这种方法效果很好,但我觉得有更好的通用解决方案。是吗?

4

1 回答 1

0

定义一个类:

class ApplicationError {
   constructor(message){
     this.message = message;
   }

   handle(req, res) {
      res.status(500).send(this.message);
   }
}

现在,对于每个处理方式与 ApplicationError 中的错误不同的错误,定义一个新类并在必要时抛出它。

class EntityNotFoundError extends ApplicationError {
  constructor(message){
    super(message);
  }

  handle(req, res) {
    res.send(404).json({message:this.message})
  }
}

现在在你的错误处理程序中(这从一个框架到另一个框架,下面的一个可以用于表达)

app.use(function(err, req, res){
  err.handle(req, res); 
});

这样做的要点是在您的班级中有一个可以标准化的“界面”。现在你知道了每个进来的错误都有一个知道如何处理错误并在响应中发送它的方法。

请小心,因为现在所有错误都必须具有处理方法。你可以用一个简单的if绕过它

if (err.handle) {
  err.handle();
} else {
  res.status(500).send();
}
于 2016-03-03T15:30:15.107 回答