在项目的开发中,无论是对底层的数据逻辑操做过程,仍是业务逻辑的处理过程,仍是控制逻辑的处理过程,都不可避免会遇到各类可预知的、不可预知的异常。处理好异常对系统有很好的保护做用,同时会大大提升用户的体验。web
Java项目中处理异常方式无非两种,要么执行trycatch操做,要么执行throw操做(抛给其它对象处理),不管采用哪一种方式,其目的是让咱们的系统对异常要有反馈。但如今的问题是咱们如何让这种反馈代码的编写即简单又直观、友好。spring
咱们在处理异常的过程当中一般要遵循必定的设计规范,例如:segmentfault
第一步:建立项目或module,并添加web依赖,代码以下:浏览器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
第二步:修改项目访问端口为80,例如springboot
server.port=80
第三步:定义Controller类,代码以下:app
package com.cy.pj.arithmetic.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class ArithmeticController { @RequestMapping("doCompute/{n1}/{n2}") @ResponseBody public String doCompute(@PathVariable Integer n1, @PathVariable Integer n2){ Integer result=n1/n2; return "Result is "+result; } }
第四步启动项目进行访问测试框架
在浏览器地址栏输入http://localhost/doCompute/10/2,检测输出结果。spring-boot
Result is 5
在浏览器地址栏输入http://localhost/doCompute/10/0,检测输出结果。测试
对于这样的默认异常处理(spring boot提供),用户体验不太友好,为了呈现更加友好的异常信息,咱们一般要对异常进行自定义处理。spa
在控制层方法中,咱们能够进行try catch处理,例如:
@RequestMapping("doCompute/{n1}/{n2}") @ResponseBody public String doCompute(@PathVariable Integer n1, @PathVariable Integer n2){ try{ Integer result=n1/n2; return "Result is "+result; }catch(ArithmeticException e){ return "exception is "+e.getMessage(); } }
一个Controller类中一般会有多个方法,这样多个方法中都写try语句进行异常处理会带来大量重复代码的编写,不易维护。
在Controller类中添加异常处理方法,代码以下:
@ExceptionHandler(ArithmeticException.class) @ResponseBody public String doHandleArithmeticException(ArithmeticException e){ e.printStackTrace(); return "计算过程当中出现了异常,异常信息为"+e.getMessage(); }
@ExceptionHandler注解描述的方法为异常处理方法(注解中的异常类型为可处理的异常类型),假如Controller类中的逻辑方法中出现异常后没有处理异常,则会查找Controller类中有没有定义异常处理方法,假如定义了,且能够处理抛出的异常类型,则由异常处理方法处理异常。
当项目由多个控制层类中有多个共性异常的处理方法定义时,咱们能够将这些方法提取到公共的父类对象中,可是这种方式是一种强耦合的实现,不利于代码的维护。咱们还能够借助spring框架中web模块定义的全局异常处理规范进行实现,例如定义全局异常处理类,代码以下:
package com.cy.pj.common.web; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ArithmeticException.class) public String doHandleArithmeticException(ArithmeticException e){ e.printStackTrace(); return "计算过程当中出现了异常,异常信息为"+e.getMessage(); } }
其中,@RestControllerAdvice 注解描述的类为全局异常处理类,当控制层方法中的异常没有本身捕获,也没有定义其内部的异常处理方法,底层默认会查找全局异常处理类,调用对应的异常处理方法进行异常处理。
本小节主要是对springboot中的异常处理机制进行了简单分析和讲解。目的是掌握springboot工程下的异常处理方式,并基于业务的不一样进行响应的异常处理。从而有效提升其用户体验,增强系统的容错能力。