Return switch 语句中的异常然后抛出被调用的方法
Return exception in switch statement and then throw the called method
我有两个方法
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() / 100 == 2) {
return response.getEntity().toString()
} else {
throw handleException(response.getStatusCode());
}
}
private RuntimeException handleException(int errorStatusCode){
switch(errorStatusCode) {
case 400:
return new RuntimeException("Invalid request");
case 401:
return new RuntimeException("User not authorized");
default:
return new RuntimeException("Unkown exception");
}
}
一切都按预期进行,但这种方法是否正确?我的意思是从方法中的开关 return new RuntimeException 然后抛出整个方法?有些东西告诉我它不是,我想知道为什么以及如何改进它..
您可以通过以下方式使其更短更直观:
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() == 200) {
return response.getEntity().toString()
} else {
throw new RuntimeException(getErrorMessage(response.getStatusCode());
}
}
private String getErrorMessage(int errorStatucCode){
switch(errorStatucCode) {
case 400:
return "Invalid request";
case 401:
return "User not authorized";
default:
return "Unkown exception";
}
你拥有的东西没有任何问题,但你可能会发现在创建异常时立即抛出它更自然:
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() / 100 == 2) {
return response.getEntity().toString()
} else {
throwException(response.getStatusCode());
}
}
private void throwException(int errorStatusCode){
switch(errorStatusCode) {
case 400:
throw new RuntimeException("Invalid request");
case 401:
throw new RuntimeException("User not authorized");
default:
throw new RuntimeException("Unkown exception");
}
}
The API I'm calling can return as a successful response 200, 201, 204. But I'm open to any suggestions.
如果您接受任何 2xx 状态代码,如何:
if (response.getStatusCode() >= 200 && response.getStatusCode() <= 299) {
干掉response.getStatusCode() / 100 == 2
。改为写 response.getStatusCode() == 200
或 response.getStatusCode() == HttpStatus.SC_OK
。
删除else
分支和if
语句后的throw
。
将方法重命名为 getExceptionByStatusCode
或 generateExceptionForStatusCode
。你不handleException
,你决定扔哪个。
选择正确的return类型。不要使用 RuntimeException
。它可以是 ResponseStatusException
或适合 HTTP/your 域抽象的任何其他类型。
针对每种情况,决定您想要的类型 return。同样,不是 RuntimeException
.
稍微改进的版本是
private String handleResponse(HttpResponse response) {
final int statusCode = response.getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
return response.getEntity().toString();
}
throw getExceptionByStatusCode(statusCode);
}
private MyDomainHTTPException getExceptionByStatusCode(int statusCode) {
switch (statusCode) {
case HttpStatus.SC_NOT_FOUND:
return new MyDomainHTTPException("...");
case HttpStatus.SC_UNAUTHORIZED:
return new MyDomainHTTPException("...");
default:
return new MyDomainHTTPException("...");
}
}
就是说,return在 Java 中抛出异常 感觉 不对。
它工作正常,但由于异常的 "special" 状态,它似乎并不完全正确。当有惰性求值时,它是合理的,当你将来满足某个条件时,或者在 Optional.orElseThrow
.
的情况下,你将抛出异常
一些习惯了 throw new
模板并且从没想过 return 异常是可编译选项的人可能会感到困惑。
在大型框架(Spring、PrimeFaces - 如果我没记错的话)中,我看到异常工厂用于根据给定的上下文和规则编写异常。他们肯定比我们更广泛地使用异常。所以你可以忽略我的感受;)
我有两个方法
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() / 100 == 2) {
return response.getEntity().toString()
} else {
throw handleException(response.getStatusCode());
}
}
private RuntimeException handleException(int errorStatusCode){
switch(errorStatusCode) {
case 400:
return new RuntimeException("Invalid request");
case 401:
return new RuntimeException("User not authorized");
default:
return new RuntimeException("Unkown exception");
}
}
一切都按预期进行,但这种方法是否正确?我的意思是从方法中的开关 return new RuntimeException 然后抛出整个方法?有些东西告诉我它不是,我想知道为什么以及如何改进它..
您可以通过以下方式使其更短更直观:
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() == 200) {
return response.getEntity().toString()
} else {
throw new RuntimeException(getErrorMessage(response.getStatusCode());
}
}
private String getErrorMessage(int errorStatucCode){
switch(errorStatucCode) {
case 400:
return "Invalid request";
case 401:
return "User not authorized";
default:
return "Unkown exception";
}
你拥有的东西没有任何问题,但你可能会发现在创建异常时立即抛出它更自然:
private String handleResponse(HttpResponse httpResponse){
if (response.getStatusCode() / 100 == 2) {
return response.getEntity().toString()
} else {
throwException(response.getStatusCode());
}
}
private void throwException(int errorStatusCode){
switch(errorStatusCode) {
case 400:
throw new RuntimeException("Invalid request");
case 401:
throw new RuntimeException("User not authorized");
default:
throw new RuntimeException("Unkown exception");
}
}
The API I'm calling can return as a successful response 200, 201, 204. But I'm open to any suggestions.
如果您接受任何 2xx 状态代码,如何:
if (response.getStatusCode() >= 200 && response.getStatusCode() <= 299) {
干掉
response.getStatusCode() / 100 == 2
。改为写response.getStatusCode() == 200
或response.getStatusCode() == HttpStatus.SC_OK
。删除
else
分支和if
语句后的throw
。将方法重命名为
getExceptionByStatusCode
或generateExceptionForStatusCode
。你不handleException
,你决定扔哪个。选择正确的return类型。不要使用
RuntimeException
。它可以是ResponseStatusException
或适合 HTTP/your 域抽象的任何其他类型。针对每种情况,决定您想要的类型 return。同样,不是
RuntimeException
.
稍微改进的版本是
private String handleResponse(HttpResponse response) {
final int statusCode = response.getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
return response.getEntity().toString();
}
throw getExceptionByStatusCode(statusCode);
}
private MyDomainHTTPException getExceptionByStatusCode(int statusCode) {
switch (statusCode) {
case HttpStatus.SC_NOT_FOUND:
return new MyDomainHTTPException("...");
case HttpStatus.SC_UNAUTHORIZED:
return new MyDomainHTTPException("...");
default:
return new MyDomainHTTPException("...");
}
}
就是说,return在 Java 中抛出异常 感觉 不对。
它工作正常,但由于异常的 "special" 状态,它似乎并不完全正确。当有惰性求值时,它是合理的,当你将来满足某个条件时,或者在 Optional.orElseThrow
.
一些习惯了 throw new
模板并且从没想过 return 异常是可编译选项的人可能会感到困惑。
在大型框架(Spring、PrimeFaces - 如果我没记错的话)中,我看到异常工厂用于根据给定的上下文和规则编写异常。他们肯定比我们更广泛地使用异常。所以你可以忽略我的感受;)