系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。系统的Dao、Service、Controller出现异常都是通过throws Exception向上抛出给前端控制器DispatcherServlet,由SpringMVC前端控制器交给异常处理器处理。
异常处理方式:
使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器
使用springmvc提供的简单异常处理器SimpleMappingExceptionResolver:
1、springmvc的xml文件里配置简单异常处理器
<!-- 配置异常处理器-->
<!--配置使用springmvc的简单异常处理器,这里注意我们也可以自己设置异常处理方法;采用springmvc给我们的HandlerExceptionResolver
接口并实现方法去设置我们的异常处理方式-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
<!-- 默认的异常错误视图,error是自定义的视图名称,因为我配置了内部资源视图解析器会自动补全路径和后缀-->
<property name="defaultErrorView" value="error"/>
<!-- 异常映射。 异常类型 -> 错误视图页面 -->
<property name="exceptionMappings">
<map>
<!-- 指定这个key对应的异常出现时 跳转的视图页面是error视图-->
<entry key="com.hlc.exception.myException" value="error"/>
<!-- 这个就是指定的类型转换异常的跳转视图是error1-->
<entry key="java.lang.ClassCastException" value="error1"/>
</map>
</property>
</bean>
2、编写故意产生异常的方法测试
@Service
public class demoServiceImpl implements demoService{
@Override
public void show1() {
System.out.println("空指针异常....");
String str = null;
str.length();
}
@Override
public void show2() {
System.out.println("零异常.....");
int i = 1/0;
}
@Override
public void show3() throws myException {
System.out.println("自定义异常....");
throw new myException();
}
@Override
public void show4() throws FileNotFoundException {
System.out.println("文件找不到异常....");
InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt");
}
@Override
public void show5() {
System.out.println("类型转换异常....");
Object str = "zhangsan";
Integer integer = (Integer) str;
}
}
3、在controller层编写类测试
@Controller
public class demoController {
@Autowired
private demoService demoService;
@RequestMapping("/exc")
public void show() throws myException, FileNotFoundException {
System.out.println("show running....");
// demoService.show1();
// demoService.show2();
// demoService.show3();
// demoService.show4();
demoService.show5();
}
}
4、error与error1页面可以自定义提示信息。
自定义使用接口实现异常处理:
1、编写自定义的异常处理器类:
public class myException extends Throwable implements HandlerExceptionResolver {
// 方法中的参数Exception:异常对象
// 显然返回值就是我要跳转的视图信息model and view
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
// 判断异常,对应操作,相当于简单的异常处理器的原理
if(ex instanceof ClassCastException){
modelAndView.addObject("info",ex.toString());
modelAndView.setViewName("error1");
}
return modelAndView;
}
}
2、在springmvc的xml文件里配置:
<!-- 配置自定义异常处理器-->
<bean class="com.hlc.exception.myException" id="exception"/>
3、测试和上面简单的异常处理器一样的测试。
java异常捕获的结构:
//在代码块的整体加上捕获语句可以在代码块中检查到异常并抛出异常的位置和信息:
public class test{
public static void main(String[] args){
try{
/*测试的代码块*/
}catch(/*异常类型*/IOExecption /*异常变量*/ e){
e.priontStackTrace();/*将异常与回溯打印到标准错误流*/
}finally{
/*可以省略,通常用来善后,处理错误代码产生的空间浪费问题*/
}
}
}