exception是什么意思

更新时间:2022-12-26 14:12:58 阅读: 评论:0


2022年12月26日发(作者:用手机怎么可以赚钱)

统⼀异常处理@ExceptionHandler

⼀、如何设置全局的异常处理

⽤@RequestBody,@ResponBody,不费吹灰之⼒就解决了JSon⾃动绑定。

接着就发现,如果遇到RuntimeException,需要给出⼀个默认返回JSON,有以下三种⽅式:

1.当这个Controller中任何⼀个⽅法发⽣异常,⼀定会被这个⽅法拦截到。然后,输出⽇志。封装Map并返回,页⾯上得到status为fal。

代码如下:

1@Controller

2publicclassAccessController{

3

4/**

5*异常页⾯控制

6*

7*@paramruntimeException

8*@return

9*/

10@ExceptionHandler()

11public@ResponBody

12MapruntimeExceptionHandler(RuntimeExceptionruntimeException){

(alizedMessage());

14

15Mapmodel=newTreeMap();

("status",fal);

17returnmodel;

18}

19

20}

2.返回到错误界⾯

代码如下:

1@Controller

2publicclassAccessController{

3/**

4*异常页⾯控制

5*

6*@paramruntimeException

7*@return

8*/

9@ExceptionHandler()

10publicStringruntimeExceptionHandler(RuntimeExceptionruntimeException,

11ModelMapmodelMap){

(alizedMessage());

13

("status",_STATUS);

15return"exception";

16}

17}

3.使⽤@ControllerAdvice,不⽤任何的配置,只要把这个类放在项⽬中,Spring能扫描到的地⽅。就可以实现全局异常的回调。

代码如下:

@ControllerAdvice

publicclassSpringExceptionHandler{

/**

*全局处理Exception

*错误的情况下返回500

*@paramex

*@paramreq

*@return

*/

@ExceptionHandler(value={})

publicResponEntityhandleOtherExceptions(finalExceptionex,finalWebRequestreq){

TResulttResult=newTResult();

tus(CodeType.V_500);

orMessage(sage());

returnnewResponEntity(tResult,);

}

}

⼆、@ExceptionHandler注解

直接在Controller⾥⾯加上⽤@ExceptionHandler标注⼀个处理异常的⽅法像下⾯这样⼦

这样,Controller⾥⾯的⽅法抛出了MissingServletRequestParameterException异常就会执⾏上⾯的这个⽅法来进⾏异常处理。

如下⾯的代码:

如果我没有传⼊id值,那么就会抛出MissingServletRequestParameterException的异常,就会被上⾯的异常处理⽅法处理。

上⾯的@ExceptionHandler()这个注解的value的值是⼀个Class[]类型的,这⾥的

ExceptionClass是你⾃⼰指定的,你也可以指定多个需要处理的异常类型,⽐如这样@ExceptionHandler(value=

{,}),这样就会处理多个异常了。

但这个只会是在当前的Controller⾥⾯起作⽤,如果想在所有的Controller⾥⾯统⼀处理异常的话,可以⽤@ControllerAdvice来创建⼀个专门

处理的类。如⼀中的3所述。

三、@ControllerAdvice注解

@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出⼤体意思是控制器增强。让我们先看看@ControllerAdvice的实现:

没什么特别之处,该注解使⽤@Component注解,这样的话当我们使⽤扫描时也能扫描到。

再⼀起看看官⽅提供的comment。

⼤致意思是:

@ExceptionHandler()

@ResponStatus(_REQUEST)

publicvoidprocessMethod(MissingServletRequestParameterExceptionex,HttpServletRequestrequest,HttpServletResponrespon)throwsIOExceptio

n("抛异常了!"+alizedMessage());

("抛异常了!"+alizedMessage());

ter().printf(sage());

uffer();

}

1

2

3

4

5

6

7

8

@RequestMapping("/index")

publicStringindex(@MyUrUrur,@RequestParamStringid,ModelMapmodelMap){

return"login";

}

1

2

3

4

@ControllerAdvice是⼀个@Component,⽤于定义@ExceptionHandler,@InitBinder和@ModelAttribute⽅法,适⽤于所有使⽤

@RequestMapping⽅法。

Spring4之前,@ControllerAdvice在同⼀调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice⽀持配置控制器的⼦

集,⽽默认的⾏为仍然可以利⽤。

在Spring4中,@ControllerAdvice通过annotations(),baPackageClass(),baPackages()⽅法定制⽤于选择控制器⼦集。

不过据经验之谈,只有配合@ExceptionHandler最有⽤,其它两个不常⽤。

在我们提到,如果单使⽤@ExceptionHandler,只能在当前Controller中处理异常。但当配合@ControllerAdvice⼀起使⽤的时候,就可以摆

脱那个限制了。

如果我们想定义⼀个处理全局的异常

乍⼀眼看上去毫⽆问题,但这⾥有⼀个纰漏,由于Exception是异常的⽗类,如果你的项⽬中出现过在⾃定义异常中使⽤@ResponStatus

的情况,你的初衷是碰到那个⾃定义异常响应对应的状态码,⽽这个控制器增强处理类,会⾸先进⼊,并直接返回,不会再有

@ResponStatus的事情了,这⾥为了解决这种纰漏,我提供了⼀种解决⽅式。

如果碰到了某个⾃定义异常加上了@ResponStatus,就继续抛出,这样就不会让⾃定义异常失去加上@ResponStatus的初衷。

@Controller

@RequestMapping(value="exception")

publicclassExceptionHandlerController{

@RequestMapping(value="e2/{id}",method={})

@ResponBody

publicStringtestExceptionHandle2(@PathVariable(value="id")Integerid){

Listlist=(newString[]{"a","b","c","d"});

(id-1);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

本文发布于:2022-12-26 14:12:58,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/34154.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:sterilizer
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图
  • 我要关灯
    我要开灯
  • 返回顶部