软件构造学习笔记:错误与异常处理

错误与异常的处理

在java的编程实践中,错误和异常是我们程序员必然要面对的两种状况。以下我们则具体的讨论异常和错误的内容。
软件构造学习笔记:错误与异常处理
如图所示,错误和异常都继承自Throwable接口,其中错误以及RuntimeException异常属于unchecked exception(编译时不需要处理的),其余的异常都属于checked exception(在编译时要catch或者throws处理的)

错误

我们程序员一般是不需要特别考虑和处理错误的,因为它一旦发生,通常不是程序员能够靠编写代码处理的。(说白了就是无能为力)我们在程序上能够做的通常只要在错误发生时,让程序体面的结束,不至于造成其它的影响。

错误发生的状况例如:
用户的输入错误(作为程序员应当在文档或者输入信息提示中做好规范,来预防此类事件。当然即便写的很明白了,你也无法保证每一个用户都能遵守)
硬件上的错误(当硬件出现问题的时候,抛出了错误当然不是程序员的锅,把锅甩给硬件工程师就完事了)
等等。

因此,程序员通常不用对Error进行实例化,也不需要对错误做额外的处理。

异常

与错误不同,异常的出现通常是程序员自己编写的代码出现的问题导致的,它通常也是可以捕获和处理的。(既然错误我们无能为力,自然要专注于处理我们能够处理的异常,异常处理也是本文的重点,因为这个问题想要甩锅是有些难度的)

什么是异常?
异常就是程序执行中发生的非正常事件,导致了程序不能按照我们预想设定的流程继续进行。
Exception将错误的信息传递给上层的调用者,并报告“案发现场”的信息。程序正常执行时通过return结束,不正常执行时通过异常结束。

当程序抛出了异常,那么就会寻找相应的异常处理程序,如果存在则按照处理程序执行,如果找不到,则完全结束。

如果不采用异常处理机制,使用逻辑判断来处理异常的话,会让正常代码和处理代码交织,显得混乱难以阅读。(如果数量不大,其实也还好)

异常的分类
在文章开头以及提到了,在异常中还分为两大类:RuntimeException(运行时异常)和其它异常

运行时异常:
运行时异常通常是程序员在代码里处理不当导致的,例如空指针异常等等,如果在代码中增加一些提前检测,就能够尽量避免

运行时异常是unchecked exception,在编译的过程中IDE与编译器都不会给出任何的错误提示,只有当运行时才会报错
Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做。(程序上的错误不解决,留着过年?)

其它异常
其它异常往往也是因为外部原因,很难被程序员完全控制,例如读入文件文件却不存在。即便在程序中增加了文件是否存在的检测也无法避免失败。

其它异常时checked exception在编译的阶段,编译器就会对没做处理的异常报错。

如何选择check/uncheck
当客户端有可能恢复异常的时候,采用checked exception。
如果客户端注定对这种异常无能为力,那就采用unchecked exception
(异常出现时,不仅仅要打印信息,还要做一些试图恢复的动作,万一就成了呢?)