(5)SpringBoot之异常处理

做Web开发,总免不了要处理各种各样的异常。SpringBoot为我们提供了一个默认的异常页面,我们启动工程后随便在浏览器的地址栏里输入一个URL,比如:http://localhost:8080/index123,即可看到该默认的异常页,如下:

SpringBoot默认异常页

然而,上面这个页面嘛,对用户来说很显然是不够友好的,所以我们需要来定制一个异常处理。

再编写代码之前,我们先来简单说说@ControllerAdvice和@ResponseStatus这两个注解:

首先@ControllerAdvice是一个@Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。

我们都知道在Controller中使用@ExceptionHandler后,该Controller其他方法未捕获的异常都会调用到使用@ExceptionHandler注解的方法,然而如果只使用@ExceptionHandler的话,只能处理当前Controller中的异常,当然,你可以在一个基类里加入带@ExceptionHandler注解的方法,这样确实能捕获到全局的异常,只是动用了继承,显然不是最佳方案。

这就是引入@ControllerAdvice的原因了,当@ExceptionHandler与@ControllerAdvice配合使用时,能够摆脱该限制,从这方面看,@ControllerAdvice可看作一个加强版的controller。因此,我们通常用@ControllerAdvice与@ExceptionHandler配合,来统一处理全局的异常。

接着@ResponseStatus,这个注解有两个属性:value属性是http状态码,reason是相关信息,我们在全局异常中,用该注解对Exception进行相应的区分,并可添加上错误的信息。

现在,我们可以开始进行编码了:

404和500的异常处理

这里,我们定义了两个最常见的全局异常——404和500,然后在默认目录templates下创建error包,并编写定制的404和error页面(省略)。

要验证这两个全局的异常也非常简单,404就用最开始随便输的URI:http://localhost:8080/index123,结果如下:

404页面

500就更简单了,直接在controller里面假如一行: int a=1/0;      这样就有500页面了,结果如下:

500页面

很显然,这样的异常页面总比上面一堆用户看了都会懵逼的英文要友好些。

上面两个都是返回页面的,那如果是返回JSON出现的异常呢?我们可不可以也定义一个用于接口的全局的异常呢?答应当然是肯定的!

首先,我们自定义一个JSON接口返回异常:

JSON接口返回异常

然后在上面的DefaultExceptionHandler类中再加入一个方法,用于全局处理JSON接口返回异常:

全局处理JSON接口返回异常

因为是处理JSON接口返回的异常,所以该方法添加了@ResponseBody。

其中的ApiResponse是封装的返回JSON格式(省略)

然后我们编写一个测试的接口:

测试JSON接口异常

在浏览器中输入:http://localhost:8080/testJSONException

显示结果如下:

{"status":1,"error_code":-1,"error_msg":"接口出现异常!!!","data":null}

你可能感兴趣的:((5)SpringBoot之异常处理)