对于异常处理程序,它自己也可以引发和处理异常。只要这些异常也是在异常处理程序的内部被处理,它们并不影响原来的异常;但是,若它超越了异常处理程序,原来的异常就会丢失。下面的
明了这一点。
type
ETrigError = class(EMathError);
function Tan(X: Extended): Extended;
begin
try
Result := Sin(X) / Cos(X);
except
on EMathError do
raise ETrigError.Create('Invalid argument to Tan');
end;
end;
若Tan在执行过程中发生了EMathError异常,则异常处理程序引发一个
为ETrigError提异常供处理程序,异常就传播到原异常处理程序的外面,从而导致
对于函数调用者来说,就像Tan函数引发了一个ETrigError异常。(不明白)
Try … finally statements(Try … finally语句)
有时,我们希望不管有没有发生异常,指定的一部分操作都要被完全执行。比如,当一个例程需要控制一个资源,不管例程是否正常结束,能释放资源是非常重要的。在这种情况下,你可以使用语句。
下面的例子演示这段代码如何打开和处理一个文件,并且,即使在执行过程中发生了错误也能保证在最后关闭文件。
Reset(F);
try
... // 处理文件F
finally
CloseFile(F);
end;
- 120 - Tan函数说ETrigError异常。因为Tan没有EMathError被销毁。 try...finally
Classes and objects
try...finally语句的语法是
try statementList1 finally statementList2 end
这里,每个statementList是一系列由分号隔开的语句。try...finally语句执行statementList1(try子句)中的命令,若它执行完毕并没有引发异常,statementList2(finally子句)被执行。若在执行statementList1时发生了异常,程序控制权转给statementList2,一旦它执行完毕,异常被重新引发。即使调用Exit、Break或Continue过程使程序控制权离开了statementList1,statementList2也会自动执行。所以,不论try子句如何结束,finally子句总是被执行。
若异常发生了但却没有在finally子句中进行处理,异常会传播到try...finally语句的外面,这样,在try子句中已经引发的异常都会丢失。所以,finally子句应当处理所有本地引发的异常,这样就不会打乱其它异常的传播。
Standard exception classes and routines(标准异常类和例程)
SysUtils单元声明了几个标准例程来处理异常,它们包括ExceptObject、ExceptAddr以及ShowException。 SysUtils和其它单元还包括很多异常类,它们(除了OutlineError)都是从Exception派生而来。
Exception类有Message和HelpContext的属性,它们用于传递错误描述和context ID,后者用于上下文相关联机文档;它还定义了多个构造函数,使你能以不同的方式指定描述信息和context ID。
- 121 -
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-90.html
可能是思维错了