4

我想知道人们认为使用 Ring 库在用 Clojure 编写的 REST 样式 api 中处理错误的好方法是什么。

Paul Umbers 在他的 Clojure RESTful API 教程中采用的一种方法是让异常自然发生,并允许它们一直冒泡到专门用于将异常转换为特定 HTTP 状态代码的中间件。

基本上,数据库约束会抛出它们自己的特定错误(例如 PSQLException),模型验证器会抛出另一种类型,所有这些都在代码 400 的保护伞下。通用异常处理程序将捕获未知异常并返回 500 代码。

一些想法:

  • 我们能做得更好吗?这是出于某种特定原因的错误设计吗?
  • 许多人会声称处理通用异常类型是不好的做法。在这里也能提出这样的论点吗?

谢谢!

4

1 回答 1

1

我绝不是这个特定领域的专家,但由于没有其他人参与过,我会给我两分钱。

您链接到的解决方案对我来说似乎是一种合理的方法。如果您的处理程序和异常中间件之间有少量合作,您还可以使用在呈现错误响应时可能有用的附加信息来标记异常,而不会将错误处理的实际细节潜入您的应用程序逻辑。

所以对于您的第一个问题:您可以根据给定的特定用例定制您的系统,但作为通用错误处理方案,这似乎相当不错。没有什么能让我觉得直接“错误”。

Exception对于您的第二个问题:当您知道您正在寻找更具体的类型时,捕获泛型类型是一种不好的做法,因为您希望避免将预期和意外错误混为一谈。如果您知道MissingResourceException在进行捆绑查找时可能会发生这种情况,那么您不希望您的异常处理程序意外地掩埋NullPointerException代码中实际错误的冒泡。

不过,在这种情况下,我认为捕获泛型Exception类型是正确的做法。MissingResourceException这个顶级处理程序的目标不是处理诸如 a 之类的特定条件,而是捕获应用程序逻辑没有捕获的任何内容,并将其转换为对 API 客户端有意义的错误信息。这是您的实现与其另一端的消费者之间的最后一道防线。

于 2013-05-07T14:43:28.137 回答