【问题标题】:ControllerAdvice Best Practice for logging source of Exception?ControllerAdvice 记录异常源的最佳实践?
【发布时间】:2017-11-15 02:12:51
【问题描述】:

我有一个@ControllerAdvice 类,它捕获各种类型的自定义异常。问题是,这些自定义异常可以在 Controller 中抛出我的各种方法。

因此,在我的 @ControllerAdvice 类中,当需要 Splunk 异常时,我需要知道发生了什么具体操作,以便将正确的代码放入我的 Splunk 日志中。

例如:

@RestController
@RequestMapping(value = "/person/{id}")
public class PersonController {

public ResponseEntity<PersonDto> getPerson(@PathVariable final String id) throws PersonNotFoundException {

public ResponseEntity<PersonStuffDto> getPersonStuff(@PathVariable final String id) throws PersonNotFoundException {

...以及我的建议:

@ControllerAdvice
public class PersonControllerExceptionHandler {

  @ExceptionHandler(PersonNotFoundException.class)
  @ResponseStatus(HttpStatus.UNAUTHORIZED) @ResponseBody
  public ErrorResponse personNotFoundException (final  PersonNotFoundException exception, final HttpServletRequest request) {
      ... Splunk ...
  }

在 personNotFoundException() 方法中,我需要 Splunk “RETRIEVING_PERSON”代码或“RETRIEVING_PERSON_STUFF”代码。

如何区分异常的来源?我是否必须检查请求...查看 url 或其他内容?如果是这样的话......将异常处理或至少这一部分留在控制器本身中不是更容易吗?

【问题讨论】:

  • 为什么要在抛出相同异常并在通用实现中捕获它时区分调用方法?要么抛出不同的异常,要么在控制器中处理它们。
  • 我明白你在说什么。只是,这两种方法都对Person进行了查找。一个返回 Person 本身,另一个返回那个 Person's Stuff。因此,虽然异常 - PersonNotFoundException - 是相同的,但我需要记录它发生的where。因此我的问题。

标签: spring model-view-controller exception-handling


【解决方案1】:

您可以执行以下操作之一:

  1. 在 PersonNotFoundException 中添加异常原因(以及必要的描述)作为可选字段。您可以通过代码或描述输入源代码。

  2. 从 PersonNotFoundException 创建两个子异常,并在异常控制器中按异常类型解析。抛出适当的子类型 PersonNotFoundException

最好是 1 个变体,因为您不应该创建新类(例外)。

Error codes within exception vs exceptions hierarhy

6 Tips to Improve Your Exception Handling

【讨论】:

  • (1) 看起来是最好的方法。现在我只需要更改代码以在某处添加源...代码已经使用..描述..不知道,我想我可以添加一个字段...谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多