如果捕获到已知错误(异常),是否应该打印堆栈跟踪?
Should you print the stacktrace if you catch a known error(Exception)?
如果我在 spring-boot 应用程序中使用 JpaRepository 作为示例。
我有通常的 Controller -> Service -> Repository 层。
假设我想将某些内容保存到数据库中并且该项目已经存在(例如,抛出 DataIntegrityViolationException 因为我在几列之间创建了一个唯一约束)。
所以可以说这是抛出的。如果用户尝试保存已具有准确数据且已存储在数据库中的对象,这是预期的行为。
我的问题是:我应该打印堆栈跟踪还是只做一个基本的 logger.error("An item already exists with the same values that you try to save").
我找不到这方面的最佳实践。
我的想法是这是一个已知错误,我知道出了什么问题,所以我不需要堆栈跟踪。它只是用额外的代码行向日志发送垃圾邮件。
有什么好的建议吗?
您应该为您的整个应用程序设置一个异常处理程序,它应该捕获异常、记录它们,并 return API 响应状态和消息。您应该查看 spring boot 提供的 org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
class 以实现同样的目的。
这是官方文档 class
A convenient base class for {@link ControllerAdvice @ControllerAdvice} classes that wish to provide centralized
exception handling across all {@code @RequestMapping} methods
through {@code @ExceptionHandler} methods.
如果这是预期的行为,请捕获异常并做一些明智的事情,不要记录错误。如果您决定要记录错误,请包括堆栈跟踪。在日志中发现无法修复的错误令人沮丧(这似乎是一个?),在日志中发现没有足够详细信息的错误也令人恼火。
当然,如果您重新抛出异常,请不要忘记包含原始异常(将其传递给构造函数)。
我会同时做 logger.error("An item already exists with the same values that you try to save", e) 。
通过这种方式,您知道这是一个已知异常,并且您还将获得堆栈跟踪
所以你不需要搜索 class 和抛出异常的方法。
OP:@NullPointer classname 已经在日志中。我知道哪里出了问题我知道为什么 JpaRepository 抛出那个错误,我不需要遵循堆栈跟踪。
问题更多,它应该记录为信息还是错误?
但是 SonarQube 想要一个有错误的堆栈跟踪。
绝对不是信息,因为您的提交(将记录保存到数据库)操作失败。
如果您不想将其记录为错误,请将其添加为警告 ( logger.warn )
所以通过查看日志你知道某些记录没有被插入。
如果我在 spring-boot 应用程序中使用 JpaRepository 作为示例。 我有通常的 Controller -> Service -> Repository 层。 假设我想将某些内容保存到数据库中并且该项目已经存在(例如,抛出 DataIntegrityViolationException 因为我在几列之间创建了一个唯一约束)。
所以可以说这是抛出的。如果用户尝试保存已具有准确数据且已存储在数据库中的对象,这是预期的行为。
我的问题是:我应该打印堆栈跟踪还是只做一个基本的 logger.error("An item already exists with the same values that you try to save").
我找不到这方面的最佳实践。 我的想法是这是一个已知错误,我知道出了什么问题,所以我不需要堆栈跟踪。它只是用额外的代码行向日志发送垃圾邮件。
有什么好的建议吗?
您应该为您的整个应用程序设置一个异常处理程序,它应该捕获异常、记录它们,并 return API 响应状态和消息。您应该查看 spring boot 提供的 org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
class 以实现同样的目的。
这是官方文档 class
A convenient base class for {@link ControllerAdvice @ControllerAdvice} classes that wish to provide centralized exception handling across all {@code @RequestMapping} methods through {@code @ExceptionHandler} methods.
如果这是预期的行为,请捕获异常并做一些明智的事情,不要记录错误。如果您决定要记录错误,请包括堆栈跟踪。在日志中发现无法修复的错误令人沮丧(这似乎是一个?),在日志中发现没有足够详细信息的错误也令人恼火。
当然,如果您重新抛出异常,请不要忘记包含原始异常(将其传递给构造函数)。
我会同时做 logger.error("An item already exists with the same values that you try to save", e) 。 通过这种方式,您知道这是一个已知异常,并且您还将获得堆栈跟踪 所以你不需要搜索 class 和抛出异常的方法。
OP:@NullPointer classname 已经在日志中。我知道哪里出了问题我知道为什么 JpaRepository 抛出那个错误,我不需要遵循堆栈跟踪。 问题更多,它应该记录为信息还是错误? 但是 SonarQube 想要一个有错误的堆栈跟踪。
绝对不是信息,因为您的提交(将记录保存到数据库)操作失败。 如果您不想将其记录为错误,请将其添加为警告 ( logger.warn ) 所以通过查看日志你知道某些记录没有被插入。