作用
如客户端调用web程序时,如果程序出现异常,特别是运行时异常;如果没有try-catch进行捕获,异常将最终不会被ExceptionResolver进行处理,导致程序出现500错误。亦或者当客户端访问一个不存在的商品详情时,此时需要呈现给用户一个显示页,用户告知“您查找的商品不存在”等信息。
没有异常处理机制下的程序
非运行时异常:
当程序需要显式的try-catch捕获进行处理时,不会造成500错误码。
但如果通过throws方式逐层抛出最终到Controller抛出,DispatcherServlet将异常分发给ExceptionResolver模块;如果未添加特殊处理,则程序抛出500错误码。
运行时异常:
由于不需要显式的try-catch,如果在程序未添加处理的情况下,通常会抛出500错误码。
访问详情不存在时显示页:
如果没有异常机制的统一处理,则添加return "redirect:/notFound.html";来处理
Spring MVC的异常处理机制下的处理方案
处理逻辑:
将系统中的异常、自定义异常(逻辑错误如访问详情时数据不存在),通过throws的方式,抛至spring的ExceptionResolver来统一进行处理。
有三种方式:SimpleMappingExceptionResolver spring提供的简单异常处理器实现,实现HandlerExceptionResolver接口的自定义异常处理器,@ExceptionHandler注解实现异常处理,
实现HandlerExceptionResolver接口的自定义异常处理器
实现方法:
建立CustomExceptionResolver实现HandlerExceptionResolver 接口。实现resolveException(),用于完成根据当前异常类型,在展示页展示对应的提示。并需在springmvc.xml中配置这个自定义的异常处理器。
可以获取出现异常的对象信息,比较常用。
spring提供的简单异常处理器SimpleMappingExceptionResolver
通过自定义异常CustomException(属性message)。当系统出现CustomException异常时,封装当前的错误原因(如“您查找的商品不存在”),被ExceptionResolver下发至SimpleMappingExceptionResolver,通过配置文件找到对应的custom_error.jsp展示对应的错误信息。其他异常则通过error.jsp展示给客户端,提示“未知错误”。
@ExceptionHandler注解实现异常处理
使用@ExceptionHandler注解实现异常处理,需每一个controller都继承自该类,对于代码的侵入性大,一般不用。
404-500码的处理
当程序出现运行时异常Unchecked Exception时,由于其不需要显式的try-catch等处理,造成程序出现500错误码。当外部请求地址错误时,出现404错误码。
对于404/500码,大多数服务器支持了在web.xml中
<error-page>
<error-code>404error-code>
<location>/spage/p_404.htmlocation>
error-page>
<error-page>
<error-code>500error-code>
<location>/spage/p_404.htmlocation>
error-page>