【发布时间】:2015-09-22 04:21:04
【问题描述】:
我想从我的 REST 端点抛出异常。但是,我对好的 REST 设计技术不太熟悉。考虑以下...
//note the throws clause
@POST
public Response saveNewActivity(@HeaderParam("sessionTokenString") String sessionTokenString, Activity activity) throws Exception {
Activity result = as.saveNewActivity(activity);
if (result == null) {
throw new DuplicateDataException("blah blah blah");
}
return Response.ok(result).build();
}
与处理异常并仅显式返回响应相比
@POST
public Response saveNewActivity(@HeaderParam("sessionTokenString") String sessionTokenString, Activity activity) {
try {
Activity result = as.saveNewActivity(activity);
if (result == null) {
throw new DuplicateDataException("blah blah blah");
}
return Response.ok(result).build();
} catch (Exception e) {
return Response.status(Response.Status.SOME_STATUS).build();
}
}
我可以使用 ExceptionMapper 映射 DuplicateDataException,如下所示
public class DuplicateDataExceptionMapper implements ExceptionMapper<DuplicateDataException> {
@Override
public Response toResponse(DuplicateDataException e) {
ErrorMessage errorMessage = new ErrorMessage ("Activity names must be unique.", <HttpStatusNumber>, "<add documentation here>");
return Response.status(Status.NOT_FOUND).entity(errorMessage).build();
}
}
尽管最终还是会返回一个响应,但是处理异常(无论它们是否是 RuntimeExceptions)的一种方式是否优于另一种方式,或者这真的不重要吗?我从未在 REST 端点上看到过 throws 语句,这就是我问的原因。
请注意 this question 或 this question 没有给出我正在寻找的答案。
【问题讨论】:
-
ExceptionMapperexists for a reason, it is the idiomatic way to handle exceptions so use it. 任何关于将异常作为好/坏设计的意见都只是意见,尤其是因为处理所有异常的特定方式来自服务电话的提供ExceptionMapper。