android捕获全局异常lin,SpringBoot项目实战之统一(全局、特殊、自定义)异常处理...

本文介绍了在Java Web开发中如何进行异常处理,包括统一异常处理、特殊异常处理和自定义异常处理。通过@ControllerAdvice和@ExceptionHandler注解实现全局异常捕获,自定义异常类EduException扩展RuntimeException,以及使用R返回结果类进行友好提示。强调了特殊异常处理的优先级高于统一异常处理,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

??当程序出现错误时,我们不希望页面直接返回“404”、“500”等信息,为了提高用户体验,我们需要统一处理异常,进行友好的提示!

2f5112768b9202dd8c86f27abb3e9682.png

二、异常分类

??(1)统一异常处理:推荐,只要出现异常,返回统一结果。

??(2)特殊异常处理:一般不使用,因为无法准确定位到项目的异常。

??(3)自定义异常处理:自己创建异常,实现返回结果,需要手动调用(try...catch)才会执行!

三、实现代码

?? 异常实现的底层原理AOP(面向切面编程),即不改变原有的代码,实现某个功能。

??注意:特殊异常处理的优先级高于统一异常处理!

/**

* @BelongProjecet: guli-framework-parent

* @BelongPackage: com.guliedu.eduservice.handler

* @ClassName: GlobalExceptionHandler

* @Description: 【推荐>方式一】统一异常处理:只要出现异常,返回统一结果

* 【方式二】特殊异常处理:如果出现ArithmeticException异常,才会处理

* 特殊异常处理>统一异常处理(优先级)

* 【推荐>方式三】自定义异常处理:自己创建异常,自己实现返回结果

* @Copyright: 2019-xxx-Powered by 研发四部

* @Author: LinHong

* @CreateDate: 2019/11/13 20:42

* @Version: V1.0

*/

@ControllerAdvice

public class GlobalExceptionHandler {

/**

* 功能描述

*

* @MethodName:

* @MethodParam:

* @Return:

* @Description: 处理全局异常的方法

* @Author: LinHong

* @CreateDate: 2019/11/13 20:47

*/

@ExceptionHandler(Exception.class)

@ResponseBody

public R error(Exception e) {

e.printStackTrace();

return R.error().message("执行了全局异常处理方法......");

}

/**

* 功能描述

*

* @MethodName: error

* @MethodParam: [e]

* @Return: com.guliedu.common.R

* @Description: 处理特殊异常的方法

* @Author: LinHong

* @CreateDate: 2019/11/13 20:52

*/

@ExceptionHandler(ArithmeticException.class)

@ResponseBody

public R error(ArithmeticException e) {

e.printStackTrace();

return R.error().message("执行了特殊异常处理方法......");

}

/**

* 功能描述

* @MethodName: error

* @MethodParam: [e]

* @Return: com.guliedu.common.R

* @Description: 自定义异常--需要手动抛出异常!!!

* @Author: LinHong

* @CreateDate: 2019/11/14 10:05

*/

@ExceptionHandler(EduException.class)

@ResponseBody

public R error(EduException e) {

// EduException e1 = new EduException(20001,"自定义异常测试,操作失败......";

e.printStackTrace();

return R.error().code(e.getCode()).message(e.getMsg());

}

}

EduException自定义异常类

继承运行时异常类,添加两个属性即可:状态码、返回信息。

/**

* @BelongProjecet: guli-framework-parent

* @BelongPackage: com.guliedu.eduservice.handler

* @ClassName: EduException

* @Description: 自定义异常

* @Copyright: 2019-xxx-Powered by 研发四部

* @Author: LinHong

* @CreateDate: 2019/11/14 9:58

* @Version: V1.0

*/

@Data

//无参构造

@NoArgsConstructor

//有参构造

@AllArgsConstructor

public class EduException extends RuntimeException{

//状态码

private Integer code;

//返回信息

private String msg;

}

(自定义异常测试)异常位置

注意:自定义异常需要手动调用,才会执行!

/**

*测试特殊异常 ArithmeticException

*/

try {

int i =666/0;

} catch (Exception e) {

//抛出自定义异常

throw new EduException(20001,"自定义异常测试,执行此操作.......");

}

R 返回结果类(附)

/**

* @BelongProjecet: guli-framework-parent

* @BelongPackage: com.guliedu.common

* @ClassName: R

* @Description: 返回结果类--链式编程

* @Copyright: 2019-xxx-Powered by 研发四部

* @Author: LinHong

* @CreateDate: 2019/11/13 14:32

* @Version: V1.0

*/

@Data

public class R {

private boolean success;

private Integer code;

private String message;

private Map data = new HashMap<>();

//构造方法私有化

private R(){}

//对外提供可以访问方法

public static R ok(){

R r = new R();

r.setSuccess(true);

r.setCode(ResultCode.OK);

r.setMessage("成功");

return r;

}

public static R error(){

R r = new R();

r.setSuccess(false);

r.setCode(ResultCode.ERROR);

r.setMessage("失败");

return r;

}

public R message(String message){

this.setMessage(message);

return this;

}

public R code(Integer code){

this.setCode(code);

return this;

}

public R data(String key, Object value){

this.data.put(key, value);

return this;

}

public R data(Map map){

this.setData(map);

return this;

}

}

ResultCode数据状态码接口(附)

package com.guliedu.common;

/**

* @BelongProjecet: guli-framework-parent

* @BelongPackage: com.guliedu.common

* @ClassName: ResultCode

* @Description: 编写统一结果返回,创建公共模块--定义返回数据状态码

* @Copyright: 2019-xxx-Powered by 研发四部

* @Author: LinHong

* @CreateDate: 2019/11/13 14:20

* @Version: V1.0

*/

public interface ResultCode {

//成功

int OK = 20000;

//失败

int ERROR =20001;

//用户名或密码错误

int LOGIN_ERROR =20002;

//权限不足

int ACCEAA_ERRORR=20003;

//远程调用失败

int REMOTE_ERROR = 20004;

//重复操作

int REPEAT_ERROR = 20005;

}

?学习、实战、总结、分享,让生活变得更美好!

?林大侠CSDN博客:https://coding0110lin.blog.csdn.net/ ?欢迎转载,一起技术交流探讨!

原文:https://blog.51cto.com/14619940/2451753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值