如果捕获到已知错误(异常),是否应该打印stacktrace?

时间:2018-06-26 06:55:41

标签: java exception exception-handling

如果我在Spring-boot应用程序中以JpaRepository为例。 我有通常的Controller-> Service-> Repository层。 可以说我想将某些内容保存到数据库中并且该项目已经存在(例如,由于在几列之间创建了唯一约束,所以引发了DataIntegrityViolationException)。

所以可以说这被抛出了。如果用户尝试保存一个已经具有确切数据并且已经存储在数据库中的对象,则这是预期的行为。

我的问题是:我应该打印堆栈跟踪记录还是只做一个基本的logger.error(“已经存在一个具有与您尝试保存的值相同的值的项目”)。

我找不到与此相关的最佳做法。 我的想法是,这是一个已知的错误,而且我知道出了什么问题,因此不需要stacktrace。只是用额外的代码行向日志发送垃圾邮件。

有什么好的指针吗?

3 个答案:

答案 0 :(得分:1)

如果这是预期的行为,请捕获异常并执行明智的操作,并且不要记录错误。如果您决定要记录错误,请包括堆栈跟踪。在无法修复的日志中发现错误很令人沮丧(这似乎是一个吗?),而且在没有足够详细信息的情况下在日志中发现错误也很烦人。

当然,如果您重新引发异常,请不要忘记包含原始异常(将其传递给构造函数)。

答案 1 :(得分:0)

您应该为整个应用程序设置一个异常处理程序,该处理程序应捕获异常,记录它们并返回API的状态和消息响应。为此,您应该检出spring boot提供的org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler类。 这是该课程的正式文档

  

一个方便的基类,用于希望提供集中化功能的{@link ControllerAdvice @ControllerAdvice}类   所有{@code @RequestMapping}方法的异常处理   通过{@code @ExceptionHandler}方法。

答案 2 :(得分:0)

我将同时执行logger.error(“项目已经存在,并且您尝试保存的值相同”,e)。 这样,您就知道这是一个已知的异常,并且您还将获得堆栈跟踪 因此您无需搜索引发异常的类和方法。

OP:@NullPointer该类名已在日志中。我知道哪里出错了,我知道为什么JpaRepository抛出该错误,我不需要遵循stacktrace。  问题更多,应该将其记录为信息还是错误?  但是SonarQube希望有错误的堆栈跟踪。

由于您的提交(将记录保存到DB)操作失败,因此绝对不作为信息。 如果您不想将其记录为错误,请将其添加为警告(logger.warn) 因此,通过查看日志,您可以知道尚未插入某些记录。