标准语法

 try
   //....
 except
   on Exception1: e1 do
     { specific exception-handling code };
   on Exception2: e2 do
     { specific exception-handling code };
   else
     { default exception-handling code };
 end;

异常嵌套

try
 { statements }
   try
 { special statements }
   except
     on ESomething do
     begin
 { handling for only the special statements }
     end;
   end;
   { more statements }
 except
   on ESomething do
   begin
     {handling for statements and more statements, but not special statements}
   end;
 end;

注意:这种类型的嵌套不限于异常处理块。您还可以将它与 finally 块(如编写 finally 块中所述)或异常处理和 finally 块的混合使用。

自定义异常

type
  EPasswordInvalid = class(Exception);

您可以随时通过使用 EPasswordInvalid 的实例调用 raise 来引发“密码无效”异常,如下所示:

if Password <> CorrectPassword then
  raise EPasswordInvalid.Create('Incorrect password entered');

若要引发异常,请调用保留字 raise,后跟异常对象的实例。这会将异常确定为来自特定地址。当异常处理程序实际处理异常时,它会通过销毁异常实例来结束,因此您永远不需要自己执行此操作;切记异常不要自己去销毁;

重新引发异常

有时,当您在本地处理异常时,您希望增加封闭块中的处理,而不是替换它。当然,当本地处理程序完成处理时,它会销毁异常实例,因此封闭块的处理程序永远不会执行操作。但是,您可以阻止处理程序销毁异常,从而使封闭的处理程序有机会做出响应。为此,请使用不带参数的 raise 命令。这称为重新引发或重新引发异常。以下示例演示了此技术:

try
 { statements }
   try
 { special statements }
   except
     on ESomething do
     begin
 { handling for only the special statements } //在这里可以写自己的处理程序,处理后重新引发这个异常;
       raise;{ reraise the exception }//未销毁前,再次引发
     end;
   end;
 except
   on ESomething do ...;{ handling you want in all cases }
 end;

如果语句部分中的代码引发 ESomething 异常,则只有外部异常处理块中的处理程序执行。但是,如果特殊语句部分中的代码引发 ESomething,则执行内部异常处理块中的处理,然后在外部异常处理块中执行更常规的处理。通过重新引发异常,您可以轻松地为特殊情况下的异常提供特殊处理,而不会丢失(或复制)现有处理程序。

如果处理程序想要引发其他异常,它可以以正常方式使用 raise 或 throw 语句,如引发异常中所述。

示例

//例1:
begin
  raise Exception.Create('抛出异常');
end;

//例2:
begin
  raise Exception.CreateFmt('%s %d', ['错误代码:', 999]); //可以有个格式
end;

示例3:

procedure TForm2.Button1Click(Sender: TObject);
var
  MyWoKao: string;
  I: Integer;
begin
  try
    try
      I := 0;
      ShowMessage(IntToStr(10 div I));
    except
      raise;
    end;
    //这里的代码并没有被执行,raise后就直接跳到finally块中去了
    MyWoKao := '123';
  finally
    ShowMessage(MyWoKao);
  end;
end;
posted on 2024-03-17 10:30  del88  阅读(39)  评论(0编辑  收藏  举报