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

如何在Java中使用try-catch处理不同的异常http类型?,java,rest,http,exception,try-catch,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) {

我是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
部分

我知道中有许多异常类型,但是如何使用
try-catch
处理它们呢?是否需要编写新的异常类型?

捕获更多异常类型 如果捕获它们的共同祖先
,则可以使用单个
捕获
捕获多个异常类型。比如说

try {
    //some code
} catch (Exception ex) {
    //handling the catch
}
将捕获所有异常,因此请尽可能一般化,但仍要正确处理错误,因此捕获
异常
可能是您的选项,也可能不是,具体取决于您的情况

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

try {
    //some code
} catch (InvalidRequestException ex) {
    throw new InvalidRequestException(ex);
}
与此相反:

try {
    //some code
} catch (InvalidRequestException ex) {
    throw ex;
}
但是如果您的
catch
只是抛出了相同的异常,那么拥有
catch
就没有任何意义了。您需要将错误设置为用户友好的,也就是说,向用户发送一个解释问题的响应,然后抛出异常。或者,您可以避免在
catch
中抛出异常,而是记录一些消息

实现您自己的异常 当然,这是一个选项,如果您有一些自定义错误类型,这是可行的。

捕获更多异常类型 如果捕获它们的共同祖先
,则可以使用单个
捕获
捕获多个异常类型。比如说

try {
    //some code
} catch (Exception ex) {
    //handling the catch
}
将捕获所有异常,因此请尽可能一般化,但仍要正确处理错误,因此捕获
异常
可能是您的选项,也可能不是,具体取决于您的情况

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

try {
    //some code
} catch (InvalidRequestException ex) {
    throw new InvalidRequestException(ex);
}
与此相反:

try {
    //some code
} catch (InvalidRequestException ex) {
    throw ex;
}
但是如果您的
catch
只是抛出了相同的异常,那么拥有
catch
就没有任何意义了。您需要将错误设置为用户友好的,也就是说,向用户发送一个解释问题的响应,然后抛出异常。或者,您可以避免在
catch
中抛出异常,而是记录一些消息

实现您自己的异常
当然,这是一个选项,如果您有一些自定义错误类型,这是可行的。

您不应该只捕获并抛出相同的异常。如果这就是你所做的,不要抓住它,仅仅添加它作为新异常的原因是没有意义的。问题是:当请求无效时,您想做什么?当服务出现内部故障时,您想做什么?一旦你知道了这一点,你就可以正确地编写
catch
代码了。我恐怕不清楚你在问什么。使用
try
/
catch
捕获在
try
块中编写的代码引发的异常。这段代码真的会引发这些异常吗?例如,它看起来不像是,我无法想象为什么Jackson会像读取字符串那样引发异常。你不应该只是捕获并抛出相同的异常。如果这就是你所做的,不要抓住它,仅仅添加它作为新异常的原因是没有意义的。问题是:当请求无效时,您想做什么?当服务出现内部故障时,您想做什么?一旦你知道了这一点,你就可以正确地编写
catch
代码了。我恐怕不清楚你在问什么。使用
try
/
catch
捕获在
try
块中编写的代码引发的异常。这段代码真的会引发这些异常吗?例如,它看起来不像是,我无法想象杰克逊为什么会提出这样的异常,比如读字符串。