如何在Java中使用try-catch处理不同的异常http类型?

时间:2019-06-23 09:20:26

标签: java rest http exception try-catch

我是Java API的初学者,正在编写RESTful API,现在需要编写API处理程序以处理来自前端的请求。只是注意到在处理请求时有很多HTTP错误。

所以我想知道如何在Java中使用try-catch捕获这些异常。

我做了一个非常基本的try-catch来处理InvalidRequestException,这是指客户端的异常。

    @Override
    public String handle(final APIGatewayProxyRequestEvent event) {
        if (event.getHttpMethod().equalsIgnoreCase(HttpMethod.POST.name())) {
            try{
                FeatureRecord featureRecord = Jackson.fromJsonString(event.getBody(), FeatureRecord.class);
                featureProcessor.createFeature(featureRecord);
                return EMPTY_STRING;
            } catch (Exception ex) {
                throw new InvalidRequestException(ex);
            }
        }

现在,我想拆分异常类型以区分不同的HTTP异常,如下所示:

    @Override
    public String handle(final APIGatewayProxyRequestEvent event) {
        if (event.getHttpMethod().equalsIgnoreCase(HttpMethod.POST.name())) {
            try{
                FeatureRecord featureRecord = Jackson.fromJsonString(event.getBody(), FeatureRecord.class);
                featureProcessor.createFeature(featureRecord);
                return EMPTY_STRING;
            } catch (InvalidRequestException ex) {
                throw new InvalidRequestException(ex);
            } catch (ServiceInternalException ex) {
                throw new ServiceInternalException(ex);
            } ... ...
        }

但是我不知道如何编写catch部分。

我知道https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500中有许多异常类型,但是如何使用try-catch处理它们呢?我需要编写新的异常类型吗?

1 个答案:

答案 0 :(得分:0)

捕获更多异常类型

如果捕获到它们的共同祖先catch,则可以用一个catchclass个异常类型。例如

try {
    //some code
} catch (Exception ex) {
    //handling the catch
}

将捕获所有异常,因此请尽可能地笼统,但仍能正确处理错误,因此根据您的情况,捕获Exception可能是您的选择,也可能不是。

如何处理异常

您正在捕获几种异常类型,而不是处理或抛出它们,而是throw相同类型的异常。例如,没有理由这样做:

try {
    //some code
} catch (InvalidRequestException ex) {
    throw new InvalidRequestException(ex);
}

代替此:

try {
    //some code
} catch (InvalidRequestException ex) {
    throw ex;
}

但是,如果您的catch仅抛出 引发相同的异常,则毫无意义地拥有catch。您需要使错误变得用户友好,即,向用户发送响应以说明问题,然后throw例外。或者,您可以避免在catch内引发所有异常,而是记录一些消息。

实施您自己的异常

这当然是一个选择,并且如果您有一些自定义错误类型,这可能是可行的。