当前位置: 首页 > 知识库问答 >
问题:

在spring REST的全局异常处理程序中使用通用异常类处理程序是好的做法吗?

白翔
2023-03-14

我参考了几篇文章来使用@controlleradvice为使用Spring的rest api项目创建全局异常处理程序。这样做的目的是在发生异常的情况下向客户端发送正确的格式化响应。在一些文章中,他们在全局异常处理程序中添加了throwableexception。我是否应该用runtimeexception替换它,因为此块用于运行时发生的异常?

异常处理程序代码:

@ControllerAdvice
public class GlobalExceptionHandler{

    @ExceptionHandler(NoDataFoundException.class)
    @ResponseStatus(code=HttpStatus.NOT_FOUND)
    public ResponseEntity<ErrorResponse> handle(NoDataFoundException ex){
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.value());
        ResponseEntity<ErrorResponse> response = new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.NOT_FOUND);
        return response;
    }
    ..... more methods to handle custom exceptions

    @ExceptionHandler(Exception.class)
    @ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity<ErrorResponse> handle(Exception ex){
        ErrorResponse errorResponse = new ErrorResponse("Something went wrong", HttpStatus.INTERNAL_SERVER_ERROR.value());
        ResponseEntity<ErrorResponse> response = new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
        return response;
    }
}

错误响应代码:

public class ErrorResponse {

    private String message;
    private int statusCode;

    public ErrorResponse(String message, int statusCode) {
        super();
        this.message = message;
        this.statusCode = statusCode;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public int getStatusCode() {
        return statusCode;
    }
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
}  
    null

共有1个答案

苏富
2023-03-14

我是否应该用RunTimeException替换它,因为此块是用于运行时发生的异常?

要确保捕获组件抛出但从未处理过的任何异常或具有比exception类型更丰富的异常的任何异常处理程序,您应该有exception的处理程序。
runtimeexception的处理程序是不够的,因为检查的异常也会在运行时抛出,如果高级组件的方法声明指定抛出异常抛出“any checked exception”,则检查的异常可能会传播到客户端或此处将应用默认行为的容器。
例如,假设rest控制器方法声明会使这种情况发生:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Foo> getOne(@PathVariable long id) throws Exception {
       // ....           
}

要重写这个默认的Spring行为,您需要为exception添加一个处理程序。
当然,这并不意味着只为exception声明一个处理程序是一种方法,但是您可能会有一些没有特定处理的异常,因此泛型处理也可以。

 类似资料:
  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc

  • 问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。

  • 1.1 异常处理的基本使用 try: <语句块1> except: <语句块2> try 捕获异常 except 发生异常时执行 try: <语句块1> except <异常类型名字>: <语句块2> except <异常类型名字> 发生对应异常时才会执行 1.2 异常处理的高级使用 try: <语句块1> except

  • 问题内容: 我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。 考虑以下简单示例: 它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是

  • 问题内容: 有没有一种方法可以添加一个全局包罗万象的错误处理程序,可以在其中将响应更改为通用JSON响应? 我无法使用该信号,因为它不允许修改响应(http://flask.pocoo.org/docs/0.10/signals/)。 相反,所有信号处理程序均以未定义的顺序执行,并且不修改任何数据。 我宁愿不要包装该函数,因为感觉就像是内部API。我想我正在寻找类似的东西: 请注意,不会接受任何参

  • 统一错误处理 文档:https://eggjs.org/zh-cn/tutorials/restful.html 自定义一个异常基类 // app / exceptions / http_exceptions.js class HttpExceptions extends Error { constructor(msg='服务器异常', code=1, httpCode=400) {