侠盗飞车罪恶都市作弊器中文版下载-windows无法与设备或资源通信
![runtimeexception](/uploads/image/0786.jpg)
2023年4月3日发(作者:microsoft office 2003 密钥)
Java全局异常处理
为了避免错误直接抛出去给⽤户,我们⼀般都是trycatch处理。
但是存在这样⼀个问题,我们trycatch捕获了,这时候系统就不会回滚了,我们需要⼿动回滚。
如果我们⼀个新增⽅法出现了异常,我们想给⽤户提⽰⼀个系统异常,但是这之前我们知道某个异常是要给⽤户明确提⽰的,⽐如该
⽤户缺少⼿机号。
⼀、使⽤trycatch的⽅式解决上⾯的问题
@RestController
publicclassTestController{
privateLoggerlog=ger();
@GetMapping("/test")
@Transactional
publicAjaxResult<?>add(){
try{
//1、业务处理
//2、具体抛出某个错误
if(true){
thrownewRuntimeException("该⽤户缺少⼿机号");
}
//3、业务处理
}catch(RuntimeExceptione){
//⽇志记录
(sage(),e);
//回滚事务
tTransactionStatus().setRollbackOnly();
if(sage().equals("该⽤户缺少⼿机号")){
e("该⽤户缺少⼿机号");
}
e("系统异常");
}
e("新增成功");
}
}
可以看到,仅仅是⼀个特殊处理,就已经这么⿇烦了,如果是多个的话复杂度更⼤。
⼆、全局异常处理
全局异常处理的意思就是:我们把抛出的某种异常统⼀处理了。
⽐如我抛出运⾏时异常,我需要做如下操作
⽇志记录
返回系统异常给前台
其实所有的异常我们都是要做两个操作,1、⽇志记录,2、返回错误信息给前台
2-1、全局异常处理器
我们知道所有的异常都属于Exception,我们可以直接对Exception进⾏处理,然后再在⾥⾯进⾏特殊处理
icationsException;
ataTruncation;
sult;
;
Factory;
ionHandler;
ntrollerAdvice;
nException;
riter;
Writer;
Exception;
TimeoutException;
nHostException;
nsientConnectionException;
/**
*异常处理器
*/
@RestControllerAdvice
publicclassEceptionHandle{
privateLoggerlog=ger();
@ExceptionHandler(value=)
publicAjaxResult<?>handle(Exceptione){
("已捕捉到异常!");
AjaxResult<?>bean=newAjaxResult<>();
Throwableex=e;
while(se()!=null){
ex=se();
}
("errorinfo:"+getTrace(e));
if(exinstanceofSessionException){
e(-1);
SessionExceptionsessionException=(SessionException)ex;
Desc(sage());
returnbean;
}elseif(exinstanceofCommunicationsException||exinstanceofSQLTransientConnectionException||exinstanceofUnknownHostException){//数据
库连接异常
e(-1);
Desc("⽬前系统⽹络较差,数据连接失败!");
returnbean;
}elseif(exinstanceofSocketTimeoutException){//⽹络连接超时
e(-1);
Desc("⽹络连接超时,请刷新数据!");
returnbean;
}elseif(exinstanceofSocketException){
e(-1);
Desc("⽹络数据丢失,请刷新数据!");
returnbean;
}elseif(exinstanceofMysqlDataTruncation){
e(-1);
Desc("字段数据长度超过限制!");
returnbean;
}elseif(exinstanceofRuntimeException){
e(-1);
Desc(sage());
returnbean;
}else{
("【系统异常】",ex);
e(-1);
Desc("系统错误,请联系管理员");
returnbean;
}
}
/**
*@desc获取异常信息
*/
publicStringgetTrace(Throwablet){
StringWriterstringWriter=newStringWriter();
PrintWriterwriter=newPrintWriter(stringWriter);
tackTrace(writer);
StringBufferbuffer=fer();
ng();
}
}
2-2、改造上⾯的需求
@RestController
publicclassTestController{
@GetMapping("/test")
@Transactional
publicAjaxResult<?>add(){
//1、业务处理
//2、具体抛出某个错误
if(true){
thrownewRuntimeException("该⽤户缺少⼿机号");
}
//3、业务处理
e("新增成功");
}
}
可以看到代码简洁了许多,如果我们再有⼀个特殊处理,我们只需要继续抛⼀个就好了。
当系统抛出异常,我们的事务会⾃动回滚。
⾃定义异常的两个重要注解@RestControllerAdvice、@ExceptionHandler
三、其它
3-1、如果单个异常处理会怎么样呢?
我们在异常处理器⾥⾯新增⼀个运⾏时异常处理
@ExceptionHandler(value=)
publicAjaxResult<?>runtimeException(RuntimeExceptione){
("运⾏时异常捕获");
("errorinfo:"+getTrace(e));
AjaxResult<?>bean=newAjaxResult<>();
e(-1);
Desc(sage());
returnbean;
}
因为我们抛出的异常就是RuntimeException,所以它会优先被运⾏时异常处理器处理
3-2、⾃定义异常
⾃定义异常也会优先匹配完全符合的异常。
⽐如我⾃定义⼀个BizException(继承RuntimeException),那么捕获它的顺序是(每次只能被捕获⼀次)
@ExceptionHandler(value=)
@ExceptionHandler(value=)
@ExceptionHandler(value=)
更多推荐
runtimeexception
发布评论