标准语法
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;
标签:Exception,handling,end,Raise,delphi,处理程序,statements,异常,raise
From: https://www.cnblogs.com/del88/p/18078239