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

Java 如果捕获到已知错误(异常),是否应打印stacktrace?,java,exception,exception-handling,Java,Exception,Exception Handling,如果我在spring引导应用程序中使用JpaRepository作为示例。 我有常用的控制器->服务->存储库层。 假设我想将某些内容保存到数据库中,并且该项已经存在。G引发DataIntegrityViolationException是因为我在几列之间创建了唯一约束 让我们假设这是抛出的。如果用户试图保存已具有确切数据且已存储在数据库中的对象,则这是一种预期行为 我这里的问题是:我应该打印stacktrace还是只做一个基本的logger.Error项已经存在,并且与您尝试保存的值相同 我找不

如果我在spring引导应用程序中使用JpaRepository作为示例。 我有常用的控制器->服务->存储库层。 假设我想将某些内容保存到数据库中,并且该项已经存在。G引发DataIntegrityViolationException是因为我在几列之间创建了唯一约束

让我们假设这是抛出的。如果用户试图保存已具有确切数据且已存储在数据库中的对象,则这是一种预期行为

我这里的问题是:我应该打印stacktrace还是只做一个基本的logger.Error项已经存在,并且与您尝试保存的值相同

我找不到这方面的最佳实践。 我的想法是,这是一个已知的错误,我知道哪里出了问题,所以我不需要stacktrace。它只是在日志中添加额外的代码行


有什么好的指针吗?

您应该为整个应用程序设置一个异常处理程序,该程序应该捕获异常,记录它们,并返回API的响应以及状态和消息。出于同样的目的,您应该查看spring boot提供的org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler类。 这是这门课的官方文件

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


如果这是一种预期的行为,请捕获异常并执行一些合理的操作,不要记录错误。如果决定要记录错误,请包括堆栈跟踪。在日志中发现无法修复的错误是令人沮丧的,而这似乎就是其中之一?在日志中发现错误而没有足够的细节也令人恼火


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

我会同时执行这两个操作。error已存在一个项,该项的值与您尝试保存的值相同,即。 这样,您就知道这是一个已知的异常,并且您也将拥有堆栈跟踪 因此,您不需要搜索引发异常的类和方法

OP:@NullPointer该类名已在日志中。我知道哪里出错了我知道为什么JpaRepository会抛出那个错误,我不需要跟踪stacktrace。 问题更多,它应该记录为信息还是错误? 但是SonarQube想要一个有错误的stacktrace


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

我将同时执行logger.error和logger.error。已存在一个项目,该项目的值与您尝试保存的值相同,即e。通过这种方式,您知道这是一个已知的异常,并且您也将拥有堆栈跟踪,因此您不需要搜索引发异常的类和方法。肯定不是作为信息,因为您的提交保存记录到数据库操作已失败。如果您不想将其记录为错误,请将其添加为警告日志记录程序。因此,通过查看日志,您会知道某些记录尚未插入。抱歉,我不明白。你为什么要忽略警告?对不起。我怎么能忘记警告的存在呢。我只是在想错误和信息。我想warn是记录它的正确方式。我会添加我的评论作为对这个问题的回答,这样对其他人也会有帮助。您可以将我的答案标记为已接受的答案。谢谢,我们已经使用ControllerAdvice进行了此操作。然后,我们捕获JpaRepository抛出的异常,并将其作为我们自己的自定义异常抛出,该异常在响应正确消息的ControllerAdvice中捕获。问题仍然存在,如果它是已知异常,我应该将其记录为错误还是仅记录为日志。信息对象已经存在,然后抛出我自己的异常,将响应属性返回给最终用户。谢谢,我们确实会重试,但有些人也会记录错误,并且在重试时不包括它。最终我们以不同的方式工作,我希望我们都以同样的方式工作。在这个问题上,我可能是错的,但我真的想做对,不要让每个人都以同样的方式工作,但最终以错误的方式结束。