在Java中避免异常与处理异常

时间:2019-02-27 13:46:26

标签: java rest spring-boot spring-data-jpa coding-style

我正在Spring Boot中实现DELETE rest端点,我不确定以下两种方法中哪种方法更好:

  1. 首先检查具有给定ID的记录是否存在于数据库中,然后安全地将其删除。

  2. 直接在spring数据存储库上调用delete并捕获spring数据引发的EmptyResultDataAccessException以返回404响应。

我喜欢第一个代码,因为代码更具可读性,并且不涉及使用异常控制流程。但是,它涉及对db的附加调用和潜在的竞争条件。

您为什么偏爱第一种或第二种方法?

2 个答案:

答案 0 :(得分:1)

如果使用@Transactional注释服务方法,则不会出现竞争条件,可以先检查是否存在(性能开销很小)。

另一方面,我总是喜欢尝试删除并捕获异常的简单性,这种假设是删除不存在的资源是例外。

还请注意,在REST中,不存在的资源上的DELETE通常应返回成功的HTTP状态代码200(确定)或204(否_CONTENT)。

@Transactional
public Response deleteAfterChecking(Thing thing) {
    if (!repository.exists(thing)) {                        
        repository.delete(thing);            
    }
    return Response.NO_CONTENT;
}

public Response deleteHandlingException(Thing thing) {
    try {               
        repository.delete(thing);            
    }
    catch (NotFoundException e) {
        // do nothing
    }
    return Response.NO_CONTENT;
}

答案 1 :(得分:0)

第一个选项在约定方面更好,并且可读性更好,但对大量数据则不是性能方面的,因为您需要两次调用。实际上,您无需在任何时候捕获EmptyResultDataAccessException。

尽管如此,您仍应考虑代码概念。如何传递可能不持久的对象的ID?有必要吗 ?没有您的代码,我无法判断,但我相信您应该考虑一下。