用Try...finally...来包try...except...和用try...except包try...finally...到底有区别吗? 如题?高手指点一二吧~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 肯定有。try后的语句 是肯定 执行的 ,如果执行的没有错 ,except后的 语句就不直执行。有错的话,就执行except后的 语句。finally和 try也一样,一定执行。 try try except end;finallyend;try try finally end;exceptend;你自己这么写一下应该就比较清楚了. 不同的位置,当然就有不同的执行顺序,意义了看你想要做什么。一般来说 except处的代码需要在try里的代码块出现异常时才会执行,而finally处的代码是一定会被执行到的 try ..finally是不管是否发生异常都能确保资源的正确释放。try...except是异常保护,遇到异常就跳出。这样可能就有部分资源未释放。基本上说,用try...finally包含try...except或try...except包含try...finally并不是绝对的,也没有好不好的分别,主要是看你需要释放的资源在哪里。procedure test1; var r:TBitmap;begin r:=TBitmap.Create; try try r.LoadFromFile('c:\a.bmp'); //do some thing here; except ShowMessage('error') end; finally r.Free; end;end;上面这个过程就能有异常处理,而且不管是否发生异常都可以正确释放资源。 没有调查就没有发言权,我自己动手试了试。查看以下代码(用try…finally包含try…except)procedure TForm1.TestProc;var BitPic: TBitmap;begin BitPic := TBitmap.Create; try try BitPic.LoadFromFile('c:\a.bmp'); //A句 ShowMessage('Execute here.'); ShowMessage('And here.'); except ShowMessage('error') end; finally BitPic.LoadFromFile('c:\b.bmp'); //B句 BitPic.Free; ShowMessage('Free BitPic...'); end; 当A句执行发生异常时,他所处的try…except块将捕捉到该异常,而当finally块中的B句发生异常,该异常将由DELPHI的应用程序框架捕捉。(VCL框架使得所编写的整个应用程序被包在一个大的try…except中)。再看以下代码(try…except包含try…finally):procedure TForm1.TestProc;var BitPic: TBitmap;begin BitPic := TBitmap.Create; try try BitPic.LoadFromFile('c:\a.bmp'); //A句 ShowMessage('Execute here.'); ShowMessage('And here.'); finally BitPic.Free; BitPic.LoadFromFile('c:\b.bmp'); //B句 ShowMessage('Free BitPic...'); end; except ShowMessage('error') end;end;无论A句还是B句执行发生异常,都将被该try…except语句捕捉。也就是说try…except将捕捉它的try块中所有的语句执行异常,无论它是不是在finally块中。这是两种包含方式的第一个区别;两种包含方式的另外一个区别就是先释放资源再处理错误,还是先处理错误再释放资源。谁先谁后,根据包含关系显而易见。根据此例得到的经验是:finally中应该只做释放资源等"善后工作",当然要做其他的也可以,它一样能被他外围的try…except语句所捕捉,不过不太厚道。Try…except是delphi提供给程序员用来捕捉特定错误的工具,所以,本人觉得如果确有必要使用这种相互包含,应推荐使用try…finally包含try…except,因为程序员不需要关心在finally块中的语句执行异常,而只需要通过该工具捕捉特定语句的异常。说到这,也许大腕儿们觉得我说了通大实话,那就当本菜鸟“自言自语”吧,一点经验,希望能给一些没有接触过的人一些帮助。 try try 语句1; exception 语句2; endFinally 语句3;end;语句4;1、如果语句1未出现异常,则会执行语句3接着执行语句4;2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;如果语句2对所有异常进行了响应,则会执行语句3接着执行语句4;try try 语句1; Finally 语句2; endExcept 语句3;end;语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4; fj218(洞庭风):閣下所寫第一段如下:-----------------------------------------try try 语句1; exception 语句2; endFinally 语句3;end;语句4;1、如果语句1未出现异常,则会执行语句3接着执行语句4;2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;如果语句2对所有异常进行了响应,则会执行语句3接着执行语句4;-----------------------------------------我通过试验发现与实际情况有所出入:无论语句2中是否响应了语句1的异常,程序都可以执行到语句4,阁下不妨亲自一试。对于阁下所写的第二段如下:-----------------------------------------try try 语句1; Finally 语句2; endExcept 语句3;end;语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4;-----------------------------------------语句1或者语句2发生异常都将执行语句3;并且,无论语句3中是否响应了异常,语句4都能被执行。我是在DELPHI7下做的,您也可以试试~~ try try except end;finallyend;表示,执行try...except...end,并最后在执行finally后的语句。(finally后的语句一定回被执行)同时,如果在执行try...finally之间的语句的过程中,如果有一场,则执行except...end之间的语句。try try finally end;exceptend;表示执行try...finally...end之间的语句,如果有异常,则捕获并执行except之后的语句。其中,try...finally...end之间的一定会北执行。而except之后的语句,则不一定被执行。 兄弟们,帮帮忙?随机数的问题 找了一段ICQ的源代码,打开时提示有个TICQCLIENT控件找不到。 如何自动登陆到服务器 ODAC中的OraSession控件,如何通过用代码的来进行连接?帮忙! 什么是软件测试,做软件测试工作能学到些什么?请各位了解的兄弟讲讲~~~~~新年快乐 哪位帮忙delphi图像旋转问题 请教:如何在chm帮助文件中执行应用程序。谢谢 delphi向窗口发送汉字的奇怪问题 TsGrid 用回车键,按列输入数据。 我的功能应该怎么实现? flex grid控件 请问InstallSheild怎样在开始菜单中加入卸载
try后的语句 是肯定 执行的 ,如果执行的没有错 ,except后的 语句就不直执行。
有错的话,就执行except后的 语句。finally和 try也一样,一定执行。
try except end;
finallyend;
try
try finally end;
exceptend;你自己这么写一下应该就比较清楚了. 不同的位置,当然就有不同的执行顺序,意义了
看你想要做什么。
一般来说 except处的代码需要在try里的代码块出现异常时才会执行,而finally处的代码是一定会被执行到的
try...except是异常保护,遇到异常就跳出。这样可能就有部分资源未释放。基本上说,用try...finally包含try...except或try...except包含try...finally并不是绝对的,也没有好不好的分别,主要是看你需要释放的资源在哪里。
procedure test1;
var
r:TBitmap;
begin
r:=TBitmap.Create;
try
try
r.LoadFromFile('c:\a.bmp');
//do some thing here;
except
ShowMessage('error')
end; finally
r.Free;
end;end;
上面这个过程就能有异常处理,而且不管是否发生异常都可以正确释放资源。
查看以下代码(用try…finally包含try…except)
procedure TForm1.TestProc;
var
BitPic: TBitmap;
begin
BitPic := TBitmap.Create;
try
try
BitPic.LoadFromFile('c:\a.bmp'); //A句
ShowMessage('Execute here.');
ShowMessage('And here.');
except
ShowMessage('error')
end;
finally
BitPic.LoadFromFile('c:\b.bmp'); //B句
BitPic.Free;
ShowMessage('Free BitPic...');
end;
当A句执行发生异常时,他所处的try…except块将捕捉到该异常,而当finally块中的B句发生异常,该异常将由DELPHI的应用程序框架捕捉。(VCL框架使得所编写的整个应用程序被包在一个大的try…except中)。再看以下代码(try…except包含try…finally):
procedure TForm1.TestProc;
var
BitPic: TBitmap;
begin
BitPic := TBitmap.Create;
try
try
BitPic.LoadFromFile('c:\a.bmp'); //A句
ShowMessage('Execute here.');
ShowMessage('And here.');
finally
BitPic.Free;
BitPic.LoadFromFile('c:\b.bmp'); //B句
ShowMessage('Free BitPic...');
end;
except
ShowMessage('error')
end;
end;
无论A句还是B句执行发生异常,都将被该try…except语句捕捉。也就是说try…except将捕捉它的try块中所有的语句执行异常,无论它是不是在finally块中。这是两种包含方式的第一个区别;
两种包含方式的另外一个区别就是先释放资源再处理错误,还是先处理错误再释放资源。谁先谁后,根据包含关系显而易见。
根据此例得到的经验是:finally中应该只做释放资源等"善后工作",当然要做其他的也可以,它一样能被他外围的try…except语句所捕捉,不过不太厚道。Try…except是delphi提供给程序员用来捕捉特定错误的工具,所以,本人觉得如果确有必要使用这种相互包含,应推荐使用try…finally包含try…except,因为程序员不需要关心在finally块中的语句执行异常,而只需要通过该工具捕捉特定语句的异常。
说到这,也许大腕儿们觉得我说了通大实话,那就当本菜鸟“自言自语”吧,一点经验,希望能给一些没有接触过的人一些帮助。
try
语句1;
exception
语句2;
end
Finally
语句3;
end;
语句4;
1、如果语句1未出现异常,则会执行语句3接着执行语句4;
2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;
如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;
如果语句2对所有异常进行了响应,则会执行语句3接着执行语句4;
try
try
语句1;
Finally
语句2;
end
Except
语句3;
end;
语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;
2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4;
閣下所寫第一段如下:
-----------------------------------------
try
try
语句1;
exception
语句2;
end
Finally
语句3;
end;
语句4;
1、如果语句1未出现异常,则会执行语句3接着执行语句4;
2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;
如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;
如果语句2对所有异常进行了响应,则会执行语句3接着执行语句4;
-----------------------------------------
我通过试验发现与实际情况有所出入:无论语句2中是否响应了语句1的异常,程序都可以执行到语句4,阁下不妨亲自一试。对于阁下所写的第二段如下:
-----------------------------------------
try
try
语句1;
Finally
语句2;
end
Except
语句3;
end;
语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;
2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4;
-----------------------------------------
语句1或者语句2发生异常都将执行语句3;
并且,无论语句3中是否响应了异常,语句4都能被执行。
我是在DELPHI7下做的,您也可以试试~~
try except end;
finallyend;
表示,执行try...except...end,并最后在执行finally后的语句。(finally后的语句一定回被执行)同时,如果在执行try...finally之间的语句的过程中,如果有一场,则执行except...end之间的语句。try
try finally end;
exceptend;表示执行try...finally...end之间的语句,如果有异常,则捕获并执行except之后的语句。其中,try...finally...end之间的一定会北执行。而except之后的语句,则不一定被执行。