违例过错节制
Java的根基道理就是“形式错误的代码不会运行”。
与C++雷同,捕捉错误最抱负的是在编译期间,最亏得试图运行措施以前。然而,并非所有错误都能在编译期间侦测到。有些问题必需在运行期间办理,让错误的缔结者通过一些手续向吸收者通报一些适当的信息,使其知道该如何正确地处理惩罚碰着的问题。
在C++和其他早期语言中,可通过几种手续来到达这个目标。并且它们凡是是作为一种划定成立起来的,而非作为措施设计语言的一部门。典范地,我们需要返回一个值或配置一个符号(位),吸收者会查抄这些值或符号,判定详细产生了什么工作。然而,跟着时间的流逝,终于发明这种做法会助长那些利用一个库的措施员的麻木情绪。他们往往会这样想:“是的,错误大概会在其他人的代码中呈现,但不会在我的代码中”。这样的效果即是他们一般不查抄是否呈现了错误(有时堕落条件确实显得太愚蠢,不值得检讨;注释①)。另一方面,若每次挪用一个要领时都举办全面、细致的错误查抄,那么代码的可读性也大概大幅度低落。由于措施员大概仍然在用这些语言维护本身的系统,所以他们应该对此有着深刻的体会:若按这种方法节制错误,那么在建设大型、结实、易于维护的措施时,必定会碰着不小的阻挠。
①:C措施员研究一下printf()的返回值便知打量。
办理的要领是在错误节制中解除所有偶尔性,强制名目标正确。这种要领实际已有很长的汗青,因为早在60年月便在操纵系统里回收了“违例节制”手段;甚至可以追溯到BASIC语言的on error goto语句。但C++的违例节制成立在Ada的基本上,而Java又主要成立在C++的基本上(尽量它看起来更象Object Pascal)。
“违例”(Exception)这个词表达的是一种“破例”环境,亦即正常环境之外的一种“异常”。在问题产生的时候,我们大概不知详细该如何办理,但必定知道已不能掉臂一切地继承下去。此时,必需果断地停下来,并由或人、某地指出产生了什么工作,以及该采纳何种对策。但为了真正办理问题,内地大概并没有足够多的信息。因此,我们需要将其移交给更级的认真人,令其作出正确的抉择(雷同一个呼吁链)。
违例机制的另一项长处就是可以或许简化错误节制代码。我们再也不消查抄一个特定的错误,然后在措施的多处处所对其举办节制。另外,也不需要在要领挪用的时候查抄错误(因为担保有人能捕捉这里的错误)。我们只需要在一个处所处理惩罚问题:“违例节制模块”可能“违例节制器”。这样可有效淘汰代码量,并将那些用于描写详细操纵的代码与专门更正错误的代码脱离开。一般环境下,用于读取、写入以及调试的代码会变得更富有层次。
由于违例节制是由Java编译器强行实施的,所以毋需深入进修违例节制,便可正确利用本书编写的大量例子。本章向各人先容了用于正确节制违例所需的代码,以及在某个要领碰着贫苦的时候,该如何生本钱身的违例。