【问题标题】:Handing errors in Clojure Ring REST-like API?在 Clojure Ring 类似 REST 的 API 中处理错误?
【发布时间】:2013-04-29 15:44:16
【问题描述】:

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

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

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

一些想法:

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

谢谢!

【问题讨论】:

    标签: web-services rest error-handling clojure asp.net-web-api


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,这是一个很好的解释,非常感谢。我会采用这种方法,看看它的长期效果如何!
    猜你喜欢
    • 2015-08-28
    • 2015-05-08
    • 2021-05-25
    • 2020-11-18
    • 2011-05-26
    • 2015-03-05
    • 2015-02-28
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多