为什么需要自定义抛出异常?
答:不满足条件的方法应提前终止程序往下执行,节省资源占用。提升程序运行效率。
spring有全局异常捕获。因此我们可以把自定义异常放到全局异常捕获里面。
Err.java继承RuntimeException
public class Err extends RuntimeException {
private boolean success;
private String data;
public Err(){ }
public Err(String data){
this.success = false;
this.data = data;
}
//省略get/set
}
GlobalException.java
@RestControllerAdvice
public class GlobalExceptionHandler{
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/** * 打印详细异常日志信息 */
public static String getExceptionDetail(Exception ex) {
String ret = null;
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream pout = new PrintStream(out);
ex.printStackTrace(pout);
ret = new String(out.toByteArray());
pout.close();
out.close();
} catch (Exception e) {
}
return ret;
}
/** * 自定义异常 */
@ExceptionHandler(value =Err.class)
public Map Err(Err e){
//不能直接返回Err对象,因为Err对象继承了RuntimeException对象,会把RuntimeException对象里面的变量也返回给前端,所以要写个map装Err对象里面的变量
Map map = new HashMap();
map.put("success",false);
map.put("data",e.getData());
return map;
}
/** * 空指针异常 */
@ExceptionHandler(value =NullPointerException.class)
public Res exceptionHandler(NullPointerException e){
log.error("空指针异常"+getExceptionDetail(e));
return new Res(false,"空指针异常");
}
/** * 其他异常 */
@ExceptionHandler(value =Exception.class)
public Res exception(Exception e){
log.error("500异常:"+getExceptionDetail(e));
return new Res(false,"服务器异常");
}
}
统一返回对象会提高代码的耦合度。spring提供了全局统一返回处理类,但是对于404这种错误的无法判断。如下图。前端需要判断各种状态码。我个人认为没必要,只需要判断成功或者失败一个即可。如果success是true,data就是数据,success是false,data就是错误信息。这样前端只需要判断success是true就可以直接拿数据,是false就直接拿错误信息了,不用写那么多判断。
Res.java统一返回对象。
public class Res<T> {
private boolean success = true;
private T data;
public Res(){ }
//正常返回数据
public Res(T data){
this.data = data;
}
//全局异常返回,正常返回数据就传true
public Res(boolean success,T data){
this.success = success;
this.data = data;
}
//省略get/set
}
接下来你可以抛出你定义的Err异常类返回给前端。这里以Controller为例。
@GetMapping("hello")
public Res hello(String str){
if ("false".equals(str))throw new Err("自定义异常信息返回。");
return new Res(str);
}
成功就是传什么就是什么。
抛异常就是你定义的异常信息。