一个例外是一个事件,其中发生在执行此一计划,即扰乱了正常的流通程序的指示。
例外情况提供必要的手段,以单独的细节做什么东西时,出于普通刚巧从主体逻辑的一个程序的难度。 在传统的编程,错误检测,报告和处理,往往会导致混淆的意大利面条代码。 举例来说,考虑pseudocode方法,在这里读入整个文件到内存:
用readfile (
打开文件;
确定其大小;
分配这么多的内存;
读文件到内存;
关闭文件;
)
乍一看,这个功能似乎很简单,但却忽略以下所有潜在的错误:
|
|
•如果文件不能被打开?
•如果长度的文件不能被确定?
•如果内存不够,不能分配?
•如果读取失败?
•如果文件不能被封闭?
要处理这样的情况下,用readfile函数必须有更多的代码做错误检测,报告和处理。 这里是一个例子,有什么功能,可能样子:
errorcodetype用readfile (
初始化返回值= 0 ;
打开文件;
如果( thefileisopen ) (
定长度的档案;
如果( gotthefilelength ) (
分配这么多的内存;
如果( gotenoughmemory ) (
读文件到内存;
如果( readfailed ) (
返回值= -1 ;
)
)否则(
返回值= -2 ;
)
)否则(
返回值= -3 ;
)
关闭文件;
如果( thefiledidntclose & &返回值== 0 ) (
返回值= -4 ;
)否则(
返回值=返回值和负百分之四;
)
)否则(
返回值= -5 ;
)
返回返回值;
)
有这么多的错误检测,报告,并回到这里说,原来的七行代码都迷失在杂波。 更糟糕的是,逻辑流程的代码,也失去了,因此难以断定,该守则是做正确的事情:是文件真的被关闭,如果功能不分配足够的内存呢? 它的更困难,以确保该代码继续做正确的事,当你修改法3个月后,以书面形式。 许多程序员是无法解决这个问题,根本无视iterrors据报道,当他们的节目坠毁。
例外的,让你写的主要流通你的代码,并处理了特殊情况下对其他地方。 如果用readfile函数用来例外而不是传统的纠错管理技术,它更像如下:
用readfile (
尝试(
打开文件;
确定其大小;
分配这么多的内存;
读文件到内存;
关闭文件;
)赶上( fileopenfailed ) (
dosomething ;
)赶上( sizedeterminationfailed ) (
dosomething ;
)赶上( memoryallocationfailed ) (
dosomething ;
)赶上( readfailed ) (
dosomething ;
)赶上( fileclosefailed ) (
dosomething ;
)
)
注例外不备件,你的努力是做好工作的检测,报告和处理错误,但他们的确帮你安排工作,更有效。
第二个优势的例外是有能力,以宣扬错误报告了呼叫堆叠的方法。 假如用readfile方法是第四个方法,在一系列的嵌套方法调用由主程序: method1来电method2 ,这就要求method3 ,最后要求用readfile :
method1 (
请method2 ;
)
method2 (
请method3 ;
)
method3 (
请用readfile ;
)
假设又method1是唯一的方法,有兴趣的缺失,可能会出现用readfile 。 传统的差错通知技术力量method2和method3宣扬错误代码,返回所用readfile了呼叫栈直到误码最终达成method1the唯一的方法就是有兴趣在他们:
method1 (
errorcodetype误差;
误差=请method2 ;
如果(错误)
doerrorprocessing ;
否则
着手;
)
errorcodetype method2 (
errorcodetype误差;
误差=请method3 ;
如果(错误)
返回误差;
否则
着手;
)
errorcodetype method3 (
errorcodetype误差;
误差=请用readfile ;
如果(错误)
返回误差;
否则
着手;
)
记得java运行环境搜查落后透过呼叫栈找到任何方法,有兴趣的,在处理某一特定例外。 一种方法可以鸭任何例外投掷内部,从而使一种更远了呼叫栈追上它。 因此,只有方法关心失误,担心侦查错误:
method1 (
尝试(
请method2 ;
)捕捉(除五) (
doerrorprocessing ;
)
)
method2投掷例外(
请method3 ;
)
method3投掷例外(
请用readfile ;
)
然而,由于pseudocode表明,回避一个例外,需要一些努力,对部分中介方法。 任何检查例外,可以扔在一个方法必须指明其全中的条款。
因为所有的例外抛出一个纲领是不是物体时,分组或分类的例外是一个很自然的结果,阶级等级。 的一个例子,一组相关的例外班在java平台,是那些界定java.ioioexception及其子孙。 ioexception是最普遍,代表任何类型的错误时,可能发生不良的i / o 。 其后裔代表更具体的错误。 举例来说, filenotfoundexception意味着一个文件无法找到在磁盘上。
一种方法可以写的具体操作者,可处理一个很具体的例外。 该filenotfoundexception类没有后代,因此下面的处理器可以处理只有一种例外:
赶上( filenotfoundexception五) (
… …
)
一种方法可以赶上一个例外,根据其集团或一般型,由指定的任何例外的superclasses在追赶声明。 举例来说,要赶上所有输入/输出的例外,不论其具体类型,是一个例外处理程序指定一个ioexception论点:
捕捉( ioexception五) (
… …
)
这个处理器将能够赶上世界所有输入/输出例外,其中包括filenotfoundexception , eofexception ,等等。 你可以找到详细了解所发生的,由质疑论调传递给例外处理机制。 举例来说,使用下列打印堆栈追踪:
捕捉( ioexception五) (
e.printstacktrace ( ) ; / /输出去system.err 。
e.printstacktrace ( system.out ) ; / /发送追查到标准输出。
)
你甚至可以成立一个例外处理程序处理任何例外与搬运这里:
捕捉(除五) ( / / (太)一般例外处理程序
… …
)
除了工人阶级,是接近最高的throwable类层次。 因此,这种处理器将赶上其他许多例外,除了那些处理器是为了追赶。 您可能需要处理的例外这样,如果你希望你的节目做的,举例来说,是打印出一个错误信息,为用户,然后退出。
在大多数情况下,不过,你想例外处理人员应尽可能具体。 原因是,第一件事就是处理协议必须做的是确定哪些类型的例外情况发生,才可以决定最佳的恢复策略。 实际上,没有赶上具体错误,处理器必须容纳任何可能性。 例外处理那些过于笼统,可以使代码更容易出错所捕获及处理例外情况并非预期的,由程序员,并为其中搬运并不打算。
如前所述,你可以创建团体的例外情况和处理例外情况,在一般的时装,或者你也可以用特定的例外类型区分例外情况和处理例外情况,在一个确切的时装。
Online: 691 users browsing the articles directory
|
|