我正在重构一些代码,这是下面示例的较大比例。这些try / catch块使“ main”类非常混乱,并掩盖了代码的作用。
我不使用Spring,但使用JaxRs处理异常。这将是服务或控制器的ReST条目,但我们也在此处进行doa流程(我知道,但实际上是这样)。因此,我们需要返回带有所需信息的ResponseEntity。
public restVerifyName(userId) {
String name;
try {
string name = nameProvider.getName(userId)
} catch (exception A) {
return new errorResponseBuilder(errorCode, errorMessage, status);
} catch (exception B) {
return new errorResponseBuilder(errorCode, errorMessage, status);
}
if (name == null) {
return new errorResponseBuilder(errorCode, errorMessage, status);
}
try {
nameAuthenticator.verifyName(name)
} catch (Exception B) {
return new errorResponseBuilder(errorCode, errorMessage, status);
}
Return Response.Ok().entity(name);
}
private errorResponseBuilder(errorCode, errorMessage, status) {
ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
return new Response.status(status).entity(errorResponse);
}
因此,我想将这些try / catches放入私有方法中,并进行更多自我记录。我的替代品大致是:
public restVerifyName() {
String name = getName();
if (!nameIsVerfied(name) {
return new errorResponseBuilder(errorCode, errorMessage);
}
Return Response.Ok().entity(name);
}
private String getName() {
String name;
try {
name = nameProvider.getName()
} catch (exception A) {
return new errorResponseBuilder(errorCode, errorMessage);
} catch (exception B) {
return new errorResponseBuilderConflict(errorCode, errorMessage);
}
if (name == null) {
return new errorResponseBuilderConflict(errorCode, errorMessage);
}
return name;
}
private boolean verifyName(name) {
try {
return nameAuthenticator.verifyName(name)
} catch (Exception B) {
return new errorResponseBuilderBadRequest(errorCode, errorMessage);
}
return false;
}
private errorResponseBuilderBadRequest(errorCode, errorMessage) {
ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
ResponseEntity response = Response.status(status).entity(errorResponse)
throw new BadRequestException(response)
}
private errorResponseBuilderConflict(errorCode, errorMessage) {
ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
ResponseEntity response = Response.status(status).entity(errorResponse)
throw new ConfictException(response)
}
在两个站中返回的响应完全相同。
不管是否存在逻辑错误/格式等。哪种通用方法是最佳实践?在响应中引发异常或返回响应(在此示例中重构目标)
这是更大范围的尝试,也有一些尝试,因此我觉得从'main'类中消除混乱更为可读。是否对带有responseEntities的异常抛出异常并让JaxRs皱眉呢?
谢谢
答案 0 :(得分:0)
一般方法是使用必要的嵌入详细信息引发异常。
然后有一个全局异常处理程序,将异常转换为响应。
对于Jax-RS,您可以使用ExceptionMapper
来捕获异常。
private String getName() {
String name;
//try {
name = nameProvider.getName()
// Only catch if exception is a checked exception or you need to transform the exception to another type with embedded detail
// Runtime exception should generally not need to be caught here
//} catch (exception A) {
// return new errorResponseBuilder(errorCode, errorMessage);
//} catch (exception B) {
// return new errorResponseBuilderConflict(errorCode, errorMessage);
//}
if (name == null) {
throw new ACustomErrorExceptionForThisKind(name);
}
return name;
}
public class ACustomErrorExceptionForThisKindMapper implements ExceptionMapper<E extends Throwable> {
public Response toResponse(ACustomErrorExceptionForThisKind e) {
....
}
}