关于异常的一些理解

        本文旨在记录一些自己对异常的理解,对于错误的地方,欢迎大家指正,谢谢。

        之前,对于异常,总有些绕不过来弯的地方,总是在纠结怎么去处理,却从未思考过异常的意义。并且,我以前一直认为,只要出现异常了,程序就是错误的。


1、异常是在程序运行时期出现的

        ——在叙述之前,先记下这样一个前提(我也不太清楚这样描述对不对......欢迎大家指正呀微笑)。 如若程序不运行,异常是没有立场的,异常只在程序运行的时候才会出现。


2、异常出现的直观效果就是让程序停掉——你不去管它它就是要生气——所以快采取适当的方式处理吧

        对,程序出现异常的时候,就是这么刚,就是不给面子,就是要停掉!很尴尬是吧......

        所以,如果是你的锅(程序本身的问题,逻辑问题之类的,比如类型转换错误、数组越界、sql写的不对啦等等),就赶紧去改代码吧,没人能帮得了你——这就是unchecked异常了。   

        如果不是你的锅(外界的问题,比如程序读了一个不存在的文件这种外界因素造成的问题),那你也不要高兴哦,程序停掉了呀!停了呀!你让用户怎么想?你让那些被占用掉的在程序停掉后未能释放的资源怎么想?要圆滑呀!要提高用户体验度呀!你可以提示用户新找一个文件后重新来过呀,不能停掉呀,这么耿直的系统,是不讨用户喜欢的哦。所以,这个时候,你可以做一些处理(try catch),让系统提示用户“请输入正确的格式”、“没有相关文件”等等;当然,你也可以可以坏一些,甩锅给其他人(throws)偷笑,前提是你有人可甩。——这就是checked异常了。


3、程序运行时出现异常,不能说明程序就一定有问题;程序有问题,在运行时也不一定会出现异常

        写的有点绕,该怎么去理解呢?这要从异常的两个类型——checked异常和unchecked异常——去说了。通过前面的第2点的描述,能够知道,这里说的程序的“问题”,指的是程序逻辑上、由于程序员自身处理不当、跟外界无关的问题。

        所以,前半句的意思就是,程序运行时出现异常,有可能是因为用户太皮输入不合要求的东西产生的,这个不能说是程序的问题;也有可能是程序逻辑有问题,那这就是程序的问题了。因此说异常出现不能说明程序一定有问题。

        后半句的意思是,程序如果自身有问题,那它在运行时,并不一定能够暴露出这个问题,因此,不一定就会出现异常,但是,没有出现异常,可不表示你这个程序没问题哦,它只是看起来没问题罢了。


最后一点:不同视角的人怎样看待异常

        我想,对于异常,无论定义为checked或者是unchecked,只要调用方法的不同人员都了解内情的话,无论用哪个都是可以的吧。但是呢,从面相对象的思想去考虑吧,我们是不关心其他人提供给我们的方法的细节是怎样的。因此,如果我是一个给其他开发人员提供公共方法的开发人员的话,我就要做这样的考虑:“对于可能出现的异常,我想让那个调用我方法的人怎样去  应对呢?”。

        然后,我大概会这么做:我在写方法的时候,会考虑种种可能会在程序运行时出现的情况,如果是那种由外界操作带来的错误,比如用户输入不合法内容、比如文件丢失导致不能读取,我就会将其定义成一个checked异常,并throws出去,让那些调用我这个方法的人去做适当处理,然后,由于是checked的异常,那个调用我方法的人一定要处理一下,否则就会编译错误。

        对于那种程序逻辑上的、由于程序员错误的应用等可能会出现的问题,如数组下标越界、sql错误等,我会定义成checked异常,这样子,那个调用我方法的人,如果出现错误,就会使程序在运行的时候死掉,哈哈哈,很腹黑。


        对于使用他人提供的方法的人,针对checked异常,不得不做出相应处理,为什么提供公共方法的人不自己去处理呢,因为他不能做出更好的处理,因此,就拜托调用该方法的人去处理了。对于unchecked异常,使用他人提供的公共方法时,调用者是不知情的,并且程序在编译时也没有提醒,所以一旦没调用好,就会导致程序运行时报错——血淋淋的教训会让调用者印象深刻。

猜你喜欢

转载自blog.csdn.net/moxiyuyan1994/article/details/80903499