我正在开发一个API。按照Clean Code和其他简洁的编程指南,我不想用try / catch块来混淆我的代码。但是我面临一个挑战:从ResponseErrorHandler抛出的自定义异常不会传播给调用者;相反,它是调用者收到的ResourceAccessException。
这是我的API代码(为简洁起见省略了不敬的部分)。注意我不是在try块中调用restTemplate.delete() - 这是故意的:
restTemplate.setErrorHandler(ecmResponseErrorHandler);
restTemplate.delete(serviceUrl, params);
我的ecmResponseErrorHandler代码(为简洁起见省略了不敬的部分):
public class ECMResponseErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
if (response.getStatusCode() != HttpStatus.OK) {
//logging etc.
return true;
}
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
//appropriately populate ECMException() and then throw it
throw new ECMException();
}
}
我的ECMException是(为了简洁省略了不敬的部分):
public class ECMException extends IOException {
public ECMException() {
super();
}
//etc.
}
现在,我的JUnit测试用例收到ResourceAccessException,而不是接收ECMException:
java.lang.Exception: Unexpected exception, expected<com.db.dbbpm.ecmfacade.exception.ECMException> but was<org.springframework.web.client.ResourceAccessException>
如果我将API代码更改为以下内容,一切正常;但是我不想用try / catch块来混淆我的API代码:
restTemplate.setErrorHandler(ecmResponseErrorHandler);
try {
restTemplate.delete(serviceUrl, params);
} catch () {
throw new ECMException();
}
为什么从ResponseErrorHandler抛出的ECMException不会一直传播到调用者?我该如何实现?
答案 0 :(得分:1)
使ECMException扩展RuntimeException(而不是IOException)解决了这个问题。现在我的代码更清晰了。
public class ECMException extends RuntimeException {
public ECMException() {
super();
}
//etc.
}