

第52讲 异常的嵌套
1. try..except可以嵌套在try..finally里面
try
try
可能产生异常的语句
except
处理异常的语句
end;
finally
释放资源的语句
end;
2. 异常中Raise处理语句,可以引发指定异常或上次的异常,如:raise EZeroDivide.Create; //创建一个除0异常
var pPointer: Pointer;
m,n: Integer;
begin
n:= 0;
GetMem(pPointer,1024); //分配内存
try
try
m:= 10 div n;
except
On EDivByZero do
begin
m:= 0;
raise; //引发上次的异常
end;
end;
finally
FreeMem(pPointer,1024); //释放内存
end;
end;
3. 异常的高用用法,如下面代码中使用异常语句比用多个if..else去判断每一个除数是否为零高明多
function Calcu(x,y,z,a,b,c:Integer):Real;
begin
try
Result:= x/a + y/b + z/c; //如果这里连续加几十个有除数,一个个去判断工程量很大
except
On EdivByZerod do //使用异常语句不管有上面有多个,只要有一个为零就会触发异常,直接返回零
Result:=0;
end;
end;
4. 工程示例
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: String;
MethodFile: TextFile;
FileOpened: Boolean;
begin
if OpenDialog1.Execute then
FileName:= OpenDialog1.FileName
else
exit; //上面打开文件失败就退出
try
AssignFile(MethodFile, Filename); //将文件名与MethodFile关联
try
Reset(MethodFile); //打开方式
FileOpened:= True; //打开标志设为true
except
On EInOutError do //如引发输入输出异常
begin
try
if FileExists(FileName) = False then //判断文件是否存在,这里可能有误。。。
begin
ReWrite(MethodFile);
FileOpened:= True;
end
else
begin
FileOpened:= False;
MessageDlg('文件不能打开', mtWarning, [mbOK], 0);
end;
except
On EInOutError do
begin
FileOpened:= False;
MessageDlg('文件不能创建', mtWarning, [mbOK], 0);
end;
end;
end;
end;
finally
CloseFile(MethodFile);
end;
if FileOpened=False then
exit;
Form1.Caption:=Form1.Caption+'-'+FileName;
end;