在Try...Except 语句中可以进行抛出异常和处理异常的工作。Try...Except 的一般形式如下:
try Statements1; except on Exception1 do HandleStatements1; on Exception2 do HandleStatements2; ⋯ on ExceptionN do HandleStatementsN; else Statements2; end. |
通常Try...Finally 语句的形式如下:
try statementList1 finally statementList2 end |
下面的例子介绍了在文件输入/输出时, 怎样用异常处理。可以区分与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 块中,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. |