Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)aaa
published in(发表于) 2014/7/19 0:09:03
delphi中Try...Except 语句和Try...Finally 语句

delphi中Try...Except 语句和Try...Finally 语句

Try...Except 语句和Try...Finally 语句

在Try...Except 语句中可以进行抛出异常和处理异常的工作。Try...Except 的一般形式如下:

try

Statements1;

except

on Exception1 do HandleStatements1;

on Exception2 do HandleStatements2;

?

on ExceptionN do HandleStatementsN;

else

Statements2;

end.

对于有些操作,在异常处理部分要进行,在正常情况下也要进行。例如在正常情况下,使用完文件之后关闭文件;如果在对文件操作的过程中出现了异常,也需要关闭已经打开的文件。这时,就可以把关闭文件的过程放在Try...Finally 语句的Finally 部分,不管Try 部分的操作是否正常,都要进行Finally 部分的操作。

通常Try...Finally 语句的形式如下:

try

statementList1

finally

statementList2

end

可以看到,Try...Finally 语句的用法与Try...Except 语句的用法很相似。StatementList1 可以为简单语句,也可以为复合语句。如果在StatementList1 中抛出了异常,程序立即转到Finally 部分;如果在StatementList1 中执行了Exit、Break 或Continue 过程而导致程序的控制离开StatementList1 部分时,程序也会跳转到Finally 部分;如果在Try 部分正常执行完毕,接着执行的还是Finally 部分。

下面的例子介绍了在文件输入/输出时, 怎样用异常处理。可以区分与Try...Except 语句和Try...Finally 语句的用法。

program Project1;

uses

Classes,Dialogs,SysUtils;

{$APPTYPE CONSOLE}

var

F:TextFile;

S:String;

begin

AssignFile(F,’f1.txt’);

try

reset(F);

try

readln(F,s);

finally

CloseFile(F);

end;

except

on EinOutError do

ShowMessage(’Error in FileIO’);

end;

end.

内层的Try...Finally 代码块用来确保文件总是关闭的,而不管是否发生了异常。这段代码的执行过程是:先执行Try 与Finally 之间的代码;如果执行完毕或出现异常,就执行Finally 与End 之间的代码;如果确实有异常发生,就跳到外层的异常处理块。这样,即使出现异常,文件也总是关闭的,并且异常总能得到处理。

注意:在Try...Finally 块中,Finally 后面的语句不管有没有异常都被执行。因此,Finally 后面的语句不能以发生异常为前提。另外,由于Finally 后面的语句并没有处理异常,因此,异常被传递到下一层的异常处理块。

外层的Try...Except 块用于处理程序中发生的异常。在Finally 中关闭文件,并且在Except 块显示一个信息,告诉用户发生了I/O 错误。

种异常处理机制比传统的错误处理方式优越,它使得错误检测代码从错误纠正代码中分离出来。这是一件好事,它会使程序更可读,使得开发人员能够集中处理程序的其他代码。

使用Try...Finally 代码块,但不捕捉特定种类的异常是有一定意义的。当代码中使用Try...Finally块的时候,意味着程序并不关心是否发生异常,而只是想最终总是能进行某项任务。Finally 块最适合于释放先前分配的资源(例如文件或Windows 资源),因为它总是执行的(即使发生了错误)。不过,很多情况下,可能需要对特定的异常做特定的处理,这时候就要用Try...Except 块来捕捉特定的异常。

例如:

Program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils,Dialogs;

var

R1,R2:double;

begin

while True do begin

try

write(’Enter a real number: ’);

readln(R1);

write(’Enter another real number: ’);

readln(R2);

writeln(’The first number divided by the Second is: ’,(R1/R2):5:3);

except

on EInOutError do

ShowMessage(’It is not a valid number! ’);

on EZeroDivide do

ShowMessage(’Can not divide by zero! ’);

end;

end;

end.

尽管在Try...Except 块中可以捕捉特定的异常,也可以用Try...Except...Else 结构来捕捉其他异常。当使用Try...Except...Else 结构的时候,应当明白Else 部分会捕捉所有的异常,包括那些并没有预料到的异常,例如内存不足或其他运行期异常。因此,使用Else 部分时要小心,能不用则不用。当进入不合格的异常处理过程中时,应当触发这个异常。




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759