码迷,mamicode.com
首页 > 其他好文 > 详细

开发之统一异常处理

时间:2019-10-12 11:09:57      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:提示信息   vat   handle   封装   png   bool   服务器   enum   监听   

系统对异常的处理使用统一的异常处理流程:
1、自定义异常类型。
2、自定义错误代码及错误信息。
3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。
可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。
不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为
RuntimeException类型(运行时异常)。
5、可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随
请求响应给客户端。

技术图片

详细步骤:

1、在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
2、统一由异常捕获类捕获异常,并进行处理
3、捕获到自定义异常则直接取出错误代码及错误信息,响应给用户。

4、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误
信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
5、将错误代码及错误信息以Json格式响应给用户。

代码实现并测试:

1.自定义异常抛出类参数:code、message、successage@ToString

public enum CmsCode implements ResultCode {
CMS_ADDPAGE_EXISTSNAME(false,24001,"页面名称已存在!")
CMS_PAGE_NOTEXIST(false,24006,"页面不存在!"),
UPDATE_FAILD(false,24008,"更新页面失败!");
//操作代码
boolean success;
//操作代码
int code;
//提示信息
String message;

 

2.自定义异常抛出类

 

@Data
public class CustomException extends RuntimeException {

//返回的代码
private ResultCode resultCode;

public CustomException(ResultCode resultCode) {
//异常信息为错误代码+异常信息
super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
this.resultCode = resultCode;
}

3.自定义捕获异常,然后全局处理 (这里要主要相面的注解,这几个注解比较重要,加上注解,抛出异常后就会监听到,然后调用这个方法,最后返回给用户)
import com.xuecheng.framework.model.response.ResponseResult;
import com.xuecheng.framework.model.response.ResultCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* 全局捕获异常类:只要作用在@RequestMapping上,所有的异常都会被捕获
*
*/
@ResponseBody //在下面添加也可以
@ControllerAdvice
public class ExceptionCatch {
private static final Logger logger = LoggerFactory.getLogger(ExceptionCatch.class);

//捕获ExceptionCast 异常
@ExceptionHandler(value = CustomException.class )
//这个注解是将参数转换成 json格式,否则会报错,因为这个是json格式
@ResponseBody
public ResponseResult customException(CustomException e) {
logger.error("catch exception : {}\r\n exception: ",e.getMessage(), e);
ResultCode resultCode = e.getResultCode();
ResponseResult responseResult = new ResponseResult(resultCode);
return responseResult;
}
}
4.抛出异常在此封装(不用每次都throw 异常,用一个类的静态方法进行抛出即可)
/**
* 抛出异常类
*/
public class ExceptionCast {
//使用此静态方法抛出自定义异常
public static void cast(ResultCode resultCode){
throw new CustomException(resultCode);
}
}
 

 

开发之统一异常处理

标签:提示信息   vat   handle   封装   png   bool   服务器   enum   监听   

原文地址:https://www.cnblogs.com/vhviqd/p/11659840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!