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) {
  1. 干掉response.getStatusCode() / 100 == 2。改为写 response.getStatusCode() == 200response.getStatusCode() == HttpStatus.SC_OK

  2. 删除else分支和if语句后的throw

  3. 将方法重命名为 getExceptionByStatusCodegenerateExceptionForStatusCode。你不handleException,你决定扔哪个。

  4. 选择正确的return类型。不要使用 RuntimeException。它可以是 ResponseStatusException 或适合 HTTP/your 域抽象的任何其他类型。

  5. 针对每种情况,决定您想要的类型 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 - 如果我没记错的话)中,我看到异常工厂用于根据给定的上下文和规则编写异常。他们肯定比我们更广泛地使用异常。所以你可以忽略我的感受;)