ControllerAdvice记录异常源的最佳实践?

时间:2017-06-13 10:38:12

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

我有一个@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&#34; RETRIEVING_PERSON&#34;代码,或者&#34; RETRIEVING_PERSON_STUFF&#34;代码。

如何区分异常的来源?我是否必须检查请求...查看网址或其他内容?如果是这样的话,那么在控制器本身中放置异常处理或至少这部分内容会更容易吗?

1 个答案:

答案 0 :(得分:1)

你可以做其中一件事:

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

  2. 从PersonNotFoundException创建两个子异常,在异常控制器中通过异常类型解析。扔适当的子类型 PersonNotFoundException

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

    Error codes within exception vs exceptions hierarhy

    6 Tips to Improve Your Exception Handling