侠盗飞车罪恶都市作弊器中文版下载-windows无法与设备或资源通信

runtimeexception
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