各位小伙伴大家好呀!
今天我们来分享异常
异常大家都很熟悉了
谁写代码没遇到几个 bug 呀
今天分享的就是 springMVC 的异常
JAVAWEB 项目的异常处理
假设我们没有在 web 的应用中对异常进行相应的处理,那么异常就会抛给 web 容器。 web 容器也没有进行处理,就会把异常信息全部显示到页面上,就像这样。
这个样子的页面,咱们调试的时候,觉得没什么,早就见过不知道多少回了,但是这要是个上线的项目,分分钟会被客户打电话骂死的~考虑一下用户体验好不好呀,用户完全看不懂这是个啥~[・_・?].
总之一句话,客户虐我千百遍,我待客户如初恋。把客户想成是自己的女朋友,然后把项目做好,哪怕项目出错了,也要把出错的页面做成一朵花哄客户开心。
容器是如何处理异常的?
我们可以在 web.xml 配置文件中,配置异常对应的异常代码 (404)或者 java 异常类型(java.lang.NullPointerException) 以及他们对应的异常页面
制作对应的异常页面
这样是不是就好多了呀!至少知道我现在要去找管理员了。
再来模拟一个500异常
说实话,第一次觉得写 bug 这么难,o(╥﹏╥)o
注意:
a:异常代码和 java 异常类型配置的区别 error-code 和 exception-type。
b:对应的 jsp 错误页面要加上 isErrorPage = "true"。
c:具体的异常信息可以从 javax.sevlet.jsp.ErrorData 对象获取,把异常信息以参数名称为 errorData 绑定在 PageContext 域。
d:容器可以处理一般的异常,但是对于一些自定义的异常处理不了。
SpringMVC 怎么处理异常
SpringMVC 为了将所有异常处理从各个业务逻辑中解耦出来,提供了统一的异常处理解决方案,有几种不同的处理方式
@ExceptionHandler注解
使用 @ExceptionHandler 注解在 controller 控制类里面增加一个处理异常的方法
在 springmvc.xml 里开启注解驱动
当 controller 类的方法出现异常时,会被使用了 @ExceptionHandler 注解的方法捕获,进行下一步的异常处理
注意:
如果存在多个 @ExceptionHandler 注解的方法,则进入离异常类型最近的方法这种捕获异常的方式可以针对本类中每个方法可能出现的异常进行单独捕获 ,但是对于我们的代码有侵入性。
自定义异常处理类
SpringMVC 所有的异常处理方式都是实现了 HandlerExceptionResolver 接口,我们可以自定一个异常处理类 ,来实现 HandlerExceptionResolver 接口
注册异常处理类
总结:
这种异常处理方式集成简单,扩展方便,无侵入。
SimpleMappingExceptionResolover
springMVC 提供了简单的异常处理器 SimpleMappingExceptionResolover 在 springmvc.xml 配置文件配置 SimpleMappingExceptionResolover 配置异常的默认错误页面,异常信息的返回变量名,异常类型与异常处理页面的对应关系。
模拟一个空指针异常
总结:
这种异常处理方式集成简单,扩展方便,无侵入,可以通过更改配置文件灵活的增加和更改异常类型
最后说一点:
这几种异常处理方式可以共存,当各种处理方式同时存在的时候,出现异常的方法会寻找当前 controller 类里面的异常注解方法,然后在去寻找自定义异常或者 sprignMVC 提供的简单异常处理器,一旦找到了对应的异常处理类,则返回,不再往下查找.