我的同事写了以下stackoverflow问题: other stack overflow question on this topic
这个问题似乎被误解了,我想找出答案,所以我开始提出这个新问题......希望更清楚一点。
基本上,我们有一个REST API。我们API的用户使用参数调用我们的方法。但有时用户用错误的参数调用它们!!也许他们的代码中有一个错误,也许他们只是想和我们一起玩,也许他们试图看看我们如何回应,谁知道呢!我们使用HTTP状态错误代码进行响应,并可能对XML响应中的无效参数进行详细说明。
一切都很好。但在内部我们通过抛出异常来处理这些无效参数。例如,如果有人通过向我们提供他们的配置文件ID来查找Person对象,但是配置文件ID不存在...我们在查找时会抛出一个PersonInvalidException。然后我们在API控制器中捕获此异常并发回HTTP 400状态错误代码。
我们的问题是......这是最佳做法,在内部针对此类用户错误抛出异常?这些异常永远不会传播回用户,这是一个REST API。它们只会使我们的代码更清晰。否则,我们可以在每个API控制器中使用验证方法,以确保参数都有意义,但这似乎效率低下。我们必须在数据库中查找两次。或者我们可以返回空值并检查它们,但这很糟糕......
你有什么想法?
答案 0 :(得分:1)
在我看来,合理使用例外情况;您不能指望您的代码从用户错误中恢复。关键是你返回给用户的内容应该足够详细,以便他们理解(并纠正)错误的原因。简单地返回HTTP 400或任何其他HTTP错误代码不足以让您的用户确定他们做错了什么。
答案 1 :(得分:0)
我认为在检测到请求参数错误时内部抛出(然后捕获)异常是完全正常的。我尝试过其他方法,但根据我的经验,这种方法效果最好。
我最近的尝试是做以下事情:
RequestFailureException
的(未经检查的)异常,该异常具有HTTP状态代码作为其属性之一。RequestFailureException
的子类型。handleException
方法,该方法记录异常并将它们映射到HTTP状态代码。doRequest
或其他用于捕获异常并使用handleException
处理它们的内容。答案 2 :(得分:0)
我正在ColdFusion中实现REST API,我正在使用与您描述的完全相同的异常。例外是摆脱当前执行状态的好方法,并向用户提供一致的错误消息。
在你给出的例子中,我宁愿返回404的状态代码。毕竟,Person是一个资源,如果这个人不存在,那对我来说就是404.