发表于: 2018-09-09 23:23:44
1 451
昨天没睡好,今天状态不佳,以查看些文档为主。
今天完成的内容:
一、学习try catch finally语法。
1、关于try catch finally运行流程。
try catch finally的运行流程大致分为三种:
第一种就是正常执行,代码1没有抛出异常,程序的执行顺序就是代码1,代码2,代码4,代码5,。因为没有抛出异常所以跳过了catch语句块。
而第二种又可以细分为两种情况:
1.代码1抛出异常,被catch语句块捕获,而catch语句块中的代码没有抛出新的异常,这样的执行顺序就是代码1,代码3,代码4,代码5.
2.代码1抛出异常,catch语句块捕获并抛出新的异常,这时候的执行顺序应该为代码1,代码3,代码4,并抛出异常。不执行代码5。
第三种情况就是:代码1抛出异常,而catch语句块没有与之匹配的异常,那么它的执行顺序就是代码1,代码4.并将异常返回给方法调用者。不执行代码5。
总结:try语句块用于测试代码是否存在异常。如果没有抛出异常。程序正常运行,如果某一段代码出现异常,则立即终止try语句块的运行,并向catch语句块抛出异常。
而catch语句块则是为了能够让代码能够顺利运行下去,不会因为try语句块中的异常而终止整个程序。并接收try语句块所抛出的异常。
finally语句块则是必定要执行的语句块,不论是否会抛出异常,一定会被执行。
而finally后面的代码则会在catch语句块与try语句块所抛出的异常无法匹配或抛出新异常时无法调用。
2、关于try catch finally的应用
主要是用于关闭一些系统资源。比如流,实际开发中,要是不能正确关闭流,服务器分分钟炸掉,那是很正常的。所以需要用该语法保证流资源的关闭。
主要关闭流的流程:
流在try外面声明,一定要先声明为null;
在try里面初始化,然后在finally里面给close。
finally里面close的时候也得再次try catch 一下。
3、自动关闭资源语法:
在JDK7之后,新增了尝试关闭资源 (try-with- Resources)语法
即在try后面的()里初始化资源,然后取消了finally。最后资源会自动关闭。
注意:JDK7的尝试关闭资源语法可套用的对象,必须操作java.lang. AutoCloseable接口。它是JDK7新增的仅定义了close()的接口。
二、了解Spring处理全局异常的三种方案
方案一:使用注解@ExceptionHandler
(1)通过在Controller下的某个方法上使用注解@ExceptionHandler ,进而该类下的所有方法抛出的异常都将被其捕获,但仅限于该类下的方法,且捕获的异常是方法内部抛出的异常。该方法衍生出来的解决方法是,写一个基类,注解为Controller类,并用@ExceptionHandler注解其某一个方法,然后所有需要异常捕获的Controller类皆继承此类,从而避免在每一个类中都需要额外写一个异常处理方法。
这种方式下,其缺陷也是极为明显的,如上面所说,其能捕获的异常仅限于同一个类下方法体内部抛出的异常,例如用POST访问限制用GET访问的请求,抛出的限制访问异常,则不能被捕获。
(2)@ExceptionHandler结合@ControllerAdvice标签使用,其中@ControllerAdvice标签的作用就近似于方法(1)中的写一个基类的方式,其作用描述为通过@ControllerAdvice,可以将对于控制器的全局配置放置在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler,@InitBinder,@ModelAttribute注解到方法上,这对所有注解了@RequestMapping的控制器内方法有效。
不同于方法(1),该种方法实现的异常统一处理程序能够捕获整个系统抛出的所有异常,包括DAO层,Service层以及(1)中不能捕获的框架上层访问异常等。故而推荐这种方式:其一般代码如下:通过传入参数Exception,用于区分到底是哪种异常,此处异常的处理方式是返回对应的JSON字符串给前端。
方案二:使用简单的SimpleMappingExceptionResolver异常处理器。
对于第一种方式来说,使用SimpleMappingExceptionResolver能够准确显示定义的异常处理页面,进行异常处理,具有集成简单、有良好的扩展性,因为是基于配置的对已有的代码没有侵入性等优点。但是该方法仅仅能够获取到异常信息,对于其他数据的情况不适用。
方案三:自定义实现HandlerExceptionResolver接口的异常处理类
HandlerExceptionResolver接口的异常处理进行异常处理,具有集成简单、良好的扩展性、对已有代码没有侵入性等优点。同时由于自定义实现,我们可以在处理异常时进行额外的处理(日志的记录、异常信息的国际化等)。项目实际的开发中也是使用的这种集成方案。
总结:看了这些实现方案,基本是为了在用户和项目交互过程中,对异常信息的包装和处理。更多的还是实现一个简单的错误页面信息返回方式。
三、跟工作的师兄聊天
了解不少关于以后发展需要了解的东西。准备任务之余学习spring-boot,和shiro框架。
明天的计划:
继续完善任务七的其他要求。
遇到的问题:
目前是理论多于实践。需要时间去实践。
今天的收获:学会了try catch finally语法作用和了解spring mvc全局异常处理。
评论