Java 是否有一个好的实践限制在一个试块中捕获的数量?

Java 是否有一个好的实践限制在一个试块中捕获的数量?,java,exception,Java,Exception,我正在编写一个REST客户端,它验证传入的请求,映射到对象,然后将请求发送到另一个REST生产者 在我的验证中,我验证了构建此请求所需的许多字段。对于每个失败,我都创建并抛出一个自定义异常。如果验证没有自动抛出一个(LocalDate.parse(myDate),例如,它抛出DateTimeParseException()) 我的问题是,在我处理这些多个异常的方法中,我有6个catch块: public ResponseEntity postSomething(@RequestBody fina

我正在编写一个REST客户端,它验证传入的请求,映射到对象,然后将请求发送到另一个REST生产者

在我的验证中,我验证了构建此请求所需的许多字段。对于每个失败,我都创建并抛出一个自定义异常。如果验证没有自动抛出一个(
LocalDate.parse(myDate)
,例如,它抛出
DateTimeParseException()

我的问题是,在我处理这些多个异常的方法中,我有6个catch块:

public ResponseEntity postSomething(@RequestBody final Request body) {
        ResponseEntity<Response> response;
        try {
            response= myIngestionService.callIngestionInterface(body);
        }
        catch (EmptyResponseException e) {
            //LOG error and return an error response with error message info
        }
        catch (DocumentNotValidBase64EncodingException e) {
            //LOG error and return an error response with error message info
        }
        catch (HighLowPercentagesOutOfRangeException e) {
            //LOG error and return an error response with error message info
        }
        catch (IdOutOfRangeException e) {
            //LOG error and return an error response with error message info
        }
        catch (DateTimeParseException e) {
            //LOG error and return an error response with error message info
        }
        catch (AnotherException e) {
            //LOG error and return an error response with error message info
        }
        //return response
    }
public ResponseEntity postSomething(@RequestBody final Request body){
反应性反应;
试一试{
响应=myIngestionService.callIngestionInterface(正文);
}
捕获(EmptyResponseException e){
//记录错误并返回带有错误消息信息的错误响应
}
捕获(DocumentNotValidBase64编码异常e){
//记录错误并返回带有错误消息信息的错误响应
}
捕获(高-低百分比范围异常e){
//记录错误并返回带有错误消息信息的错误响应
}
捕获(IdOutOfRangeException e){
//记录错误并返回带有错误消息信息的错误响应
}
捕获(DateTimeParse异常){
//记录错误并返回带有错误消息信息的错误响应
}
捕获(另一个例外e){
//记录错误并返回带有错误消息信息的错误响应
}
//返回响应
}

这对我来说可能有点过分,是吗?我有一种不安的感觉,在这一点上,我可能应该回去重新考虑我的验证,但不确定。

要么catch
Exception
(父类),要么使用多重catch。为什么需要六个单独的catch块呢?如果所有这些情况都是您的,那么我可以建议两种重构(不是互斥的):让它们都从一个基类“yourvalidateexception”继承,您可以在单个块中捕获它们。和/或仅具有一个异常类,并使用DateTime、IdRange、Base64等值创建类似于枚举的ValidationFailure。。。您可能会测试instanceof(或打开枚举),而不是有多个块,不确定哪一个是“最佳”,但您可以使用非异常相关模式来完成此操作。@ElliottFrisch可能会返回不同的自定义消息您所需的字段验证逻辑是异常驱动的,有什么具体原因吗?无偿使用异常会导致性能下降。您可以简单地编写一个验证处理程序,将对象传递给它,聚合错误,然后只抛出一个带有适当错误数组的异常。异常是昂贵的,因为填充堆栈跟踪,然后展开堆栈。请记住,异常是在程序运行时执行过程中发生的意外事件,它会中断程序流。在您的情况下,验证是逻辑的一部分。您只会在验证失败的情况下失去性能。为什么让失败有效运作很重要?