用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

第52讲

上次修改时间: 2023-09-10 16:47:42      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\小甲鱼Delphi\      下一页

第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;