2010-04-25 43 views
1

我们有一个很好的REST API。我们正在重构并决定如何在API内部处理错误。在内部使用Java异常来处理REST API用户错误?

例如,用户需要指定应该取值为“1984”,“Crash”或“Avatar”的“movie”url参数。首先我们检查一下它是否有一个有效的值。

如果电影参数无效,最佳方法是什么?从内部的方法之一

  • 返回NULL并为您在主API调用方法
  • 空从主API方法

我的内部方法和捕获异常抛出一个异常认为这会使我们的代码更具可读性和优雅性来使用异常。但是,我们不情愿,因为我们可能因为用户API输入错误而抛出许多异常,所以我们的代码可能是完美的。这似乎不是正确使用例外。如果存在异常情况下的性能损失严重,这对于需要收集堆栈跟踪等是有意义的,那么当我们需要做的只是告诉用户参数错误时,我们不必要地花费资源。

这些是REST API方法,所以我们不会向API的用户宣传异常,我们也不希望即使可能。

那么这里最好的做法是什么?使用丑陋的空值或使用java的异常机制?

+0

当用户通过电影中的参数“是无效的”,这是否代表了一个错误的用户已经做出,或者是它只是一个搜索小姐? – 2010-04-25 21:33:32

回答

2

都没有。

关键是传递一个错误的参数并不是那种特殊的条件。特殊情况会引发例外情况。 (这是,这里不再使用它们的原因,而不是性能。)

你应该使用类似Spring的资料验证API进行绑定,在传递的参数。

一个REST API的客户端不应该被接受空或异常。他们应该得到一个错误消息,让他们知道发生了什么,而不会暴露这些细节。 “对不起,我们找不到那部电影”或null?一起去,手下。

+0

没错。 RESTful API应该像任何其他应用程序一样验证用户输入。如果输入错误,请告诉用户原因。如果错误的输入使得过去您的过滤器/验证,然后就是在适当的时候抛出一个异常,记录它,并通知开发团队,让他们可以修复验证(或任何为越野车)。 – timdev 2010-04-25 21:37:28

0

我会假设你在这里进行输入验证,在这种情况下,你的数据库会为安全字符串做一个查询,并且它不会找到记录,因为它不存在于你的数据库中,好吗?

如果你正在使用任何MVC框架模型应该抛出一个RecordNotFound异常没有?

如果您总是期望找到一个值,那么抛出异常如果它丢失。这个例外意味着有问题。

如果该值可能丢失或存在,并且两者都对应用程序逻辑有效,则返回null。

更重要的是:你在代码的其他地方做了什么?一致性很重要。

1

如果出现无效请求(例如验证错误),则应显示400状态码(错误请求)。

内部我也想创造一个例外层次结构将映射到HTTP休息域(见错误情况的状态码)。

例子(简体和被检查异常):

 

class RESTBaseException extends RuntimeException{ 
    int statusCode; 

    public RESTBaseException(int statusCode){ this.statusCode=statusCode; } 

    //if no statusCode passed we fallback to very broad 500 server error. 
    public RESTBaseException(){ this.statusCode=500; } 
} 

class RESTValidationException extends RESTBaseException{ 

    RESTValidationException(){ 
     super(404); 
    } 
} 
 

您可以通过驶过的错误消息上面的例子扩展到构造函数来使客户更加满意。

后来你应该抓住这些异常有专用的异常处理程序在你的servlet处理程序链(测绘的状态码servlet响应)。例如在春季mvc中有很好的例外处理解决方案。

通常我不喜欢创造了深刻的自定义异常hierachies但我认为REST API层他们是OK(因为状态代码后传播)。