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

原创 2012年03月24日 08:24:59

在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 部分时要小心,能不用则不用。当进入不合格的异常处理过程中时,应当触发这个异常。

相关文章推荐

delphi try except语句 和 try finally语句用法以及区别

try//尝试执行    {SomeCode}   except//出错的时候执行, Except有特定的错误类型      {SomeCode}   end; try//尝试执行{SomeCode}...

delphi try except语句 和 try finally语句用法

不错。 原文地址:try except语句 和 try finally语句用法以及区别" href="http://blog.sina.com.cn/s/blog_6f3758950100o...

Python中的try...except...finally

try, except, finally是Python中的异常捕捉机制,通常会有try...except; try...

python try except else finally 执行顺序详细分析

python try except else finally 执行顺序详细分析

python try/except/finally

稍微总结一下,否则总是忘。 x = 'abc' def fetcher(obj, index): return obj[index] fetcher(x, 4) 输出: File "te...
  • spch2008
  • spch2008
  • 2013年07月16日 15:47
  • 44353

Delphi异常处理try except语句和try finally语句用法以及区别〖原创+转载〗

一直写程序都没管他们,也尽量很少用,今天终于想把他给弄个明白,在网上找来,记下! 主要是前面小部分,后面的是详细说明(很啰嗦!) 一、异常的来源   在Delphi的应用程序中,下列的情...

delphi异常信息捕捉

  刚从delphi2009中学到的,哈哈!  粗放型获取异常信息,全部异常都接收.主要是用于客户端的.开发时,异常可以看到,而到了客户端,由于没有开发环境,无法获知详细的信息,为debug增加了难度...

CSDN Blog小升级,修正bug

各位网友:CSDN Blog已于2006年4月18日升级到新版本,本次升级修改了后台修改“显示条目”设置后,前台不更新的bug。本周晚些时候还将做一次升级,修正不能上传PNG文件等bug。CSDN B...

delphi try except语句 和 try finally语句用法

不错。 原文地址:try except语句 和 try finally语句用法以及区别" href="http://blog.sina.com.cn/s/blog_6f3758950100o...

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

在Try...Except 语句中可以进行抛出异常和处理异常的工作。Try...Except 的一般形式如下:  try Statements1; except on Except...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi中Try...Except 语句和Try...Finally 语句 .
举报原因:
原因补充:

(最多只允许输入30个字)