- 118 -
HandleZeroDivide。 exceptionBlock或者是 ,type用来表示异常类,statement是任exceptionBlock)被忽,都将试图对它else子句。
若还没有合适的异常处理程序、或else依此类推。如果达到最外层的try...except程序控制权转给异常处理程序、elseExit、Break或Continue使程序控2个处理溢出,最后一个处理其它的数学运,语句块;(如果调用
Classes and objects
on EMathError do HandleMathError;
end;
在异常处理程序中,可以在异常类之前指定一个标志符,在执行on...do后面的语句时,它表示异常对象,标志符的作用域被限定在这个语句中。比如,
try
...
except
on E: Exception do ErrorDialog(E.Message, E.HelpContext);
end;
若在异常处理块中使用了else子句,则它处理所有未经异常处理程序处理的异常。比如,
try
...
except
on EZeroDivide do HandleZeroDivide;
on EOverflow do HandleOverflow;
on EMathError do HandleMathError;
else
HandleAllOthers;
end;
这里,else子句处理所有不是EMathError的异常。
若异常处理块没有异常处理程序,而只是包含一系列语句,则它们处理所有的异常。比如,
try
...
except
HandleException;
end;
这里,try和except之间的代码在运行时产生的异常,都由HandleException
Re-raising exceptions(重新引发一个异常)
当关键字raise在异常块中出现,并且它的后面没有对象引用时,它引发正在处理的异常。这使得异常处理程序能对错误做有限处理后重新引发它。对于发生异常后必须进行清除工作、但又不能进行全面处理的过程或函数,重新引发一个异常是有用的。
比如,GetFileList函数分配一个TStringList对象,并用指定搜索路径下的文件名来填充它。
function GetFileList(const Path: string): TStringList;
var
I: Integer;
SearchRec: TSearchRec;
begin
Result := TStringList.Create;
try
I := FindFirst(Path, 0, SearchRec);
while I = 0 do
begin
Result.Add(SearchRec.Name);
- 119 - 例程进行处理。
Classes and objects
I := FindNext(SearchRec);
end;
except
Result.Free;
raise;
end;
end;
GetFileList创建一个TStringList对象,然后使用FindFirst和FindNext函数(在SysUtils单元定义)来初始化它。如果初始化失败(比如搜索路径无效,或者没有足够的内存来填充字符串列表),GetFileList需要释放字符串列表,因为函数的调用者还不知道它的存在。由于这个原因,初始化字符串列表在try...except语句中执行,若发生了异常,异常处理块释放字符串列表,然后重新引发这个异常。Nested exceptions(嵌套的异常)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-89.html
期待杨洋未来更多的作品