”戏“说java—异常及异常处理概述


前言

何为异常?专业的讲,异常是导致程序中断运行的一种指令流。通俗的说,异常(Exception)表达的是一种“例外”情况,亦即正常情况之外的一种“异常”。所谓的正常的情况是在理想境界中的,程序永远不会出现问题,用户输入的数据永远是正确的,逻辑没有任何问题,选择打开的文件也一定是存在的,内存永远是够用的……反正不存在任何的逻辑或者非逻辑的问题,但是一旦出现这些问题,程序就会中断。既然不存在理想的境界,那么,在异常出现的时候我们就需要妥善的对它进行处理。

一、早期的异常处理方案

早期语言通过建立一种规范来处理异常,返回一个值或设置一个标志(位),接收者会检查这些值或标志,判断具体发生了什么事情。很显然这是个很有缺陷的解决方案。

首先,返回值的约定会纷繁复杂,程序员需要熟悉各种象征错误的返回值。这对程序员可是一个很重的负担。

其次,若每次调用一个方法时都进行全面、细致的错误检查,那么代码的可读性也可能大幅度降低。

最后也是最具有影响的,若按这种方式控制错误,那么在创建大型、健壮、易于维护的程序时,肯定会遇到非常大的阻挠。

既然这样的方案存在这么多的缺陷,那优化的解决方案又是怎么样的呢?

二、异常处理机制

优化的解决的方案是在错误控制中排除所有偶然性,强制格式的正确。这样的异常处理方案可以追溯到BASIC语言和操作系统之中,通常称为“异常处理机制”。

在程序发生问题的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去。此时,必须坚决地停下来,并由某人、某地指出发生了什么事情,以及该采取何种对策。但为了真正解决问题,当地可能并没有足够多的信息。因此,我们需要将其移交给更高级的负责人,令其做出正确的解决方案(类似一个命令链)。

异常处理机制可以简化错误控制代码。我们再也不用检查一个特定的错误,然后在程序的多处地方对其进行控制。此外,也不需要在方法调用的时候检查错误(因为保证有人能捕获这里的错误)。我们只需要在一个地方处理问题:“违例控制模块”或者“违例控制器”(java中是try-catch)。这样可有效减少代码量,并将那些用于描述具体操作的代码与专门纠正错误的代码分隔开。一般情况下,用于读取、写入以及调试的代码会变得更富有条理。另外在构建大型的,灵活的,健壮的应用程序的时候也会非常的方便。

三、异常处理基本模型

知道异常处理机制后,我们需要了解下两种异常处理基本模型

1.终止模型

一种称为"终止模型"(它是Java与C++所支持的模型)。在这种模型中,将假设错误非常关键,将以致于程序无法返回到异常发生的地方继续执行。一旦异常被抛出,就表明错误已无法挽回,也不能回来继续执行。

2.恢复模型

另一种称为"恢复模型"。意思是异常处理程序的工作是修正错误,然后重新尝试调动出问题的方法,并认为第二次能成功。

对于恢复模型,通常希望异常被处理之后能继续执行程序。在这种情况下,抛出异常更像是对方法的调用--可以在Java里用这种方法进行配置,以得到类似恢复的行为.(也就是说,不是抛出异常,而是调用方法修正错误.)或者,把try块放在while循环里,这样就可以不断的进入try块,直到得到满意的结果。

虽然恢复模型开始显得很吸引人,并且人们使用的操作系统也支持恢复模型的异常处理,但程序员们最终还是转向了使用类似"终止模型"的代码。

因为:

处理程序必须关注异常抛出的地点,这势必要包含依赖于抛出位置的非通用性代码.这增加了代码编写和维护的困难,对于异常可能会从许多地方抛出的大型程序来说,更是如此.java程序设计语言大多用于构建大型应用程序,java的基本理念是“结构不佳的代码不能运行”(摘自《Think in java 》)。采用终止模型更加的能够构建健壮,灵活的代码。

四、总结

程序出现的例外的情况叫做异常,异常会中断程序的运行,造成用户对应用程序的不良体验,因此,对于异常,我们必须采取相应的处理。早期的异常处理方案是通过返回一个值或设置一个标志(位)的规范来处理异常,然而这样的方案存在很多的缺陷,不易掌握,也不易使用。后来对异常的优化的解决方案是在错误控制中排除所有偶然性,强制格式的正确。即“异常处理机制”的方式来处理处理异常。这样的方案能够简化错误的控制代码,将处理异常代码和专门纠正错误的代码分离开来,已达到解耦的作用。这样还能够重用处理异常的代码。还有java采用的是终止模型来处理异常,很显然这些对构建大型的,灵活的,健壮的应用程序非常的有帮助。

参考:《Thinking in java》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值