首页 > 其他分享 >delphi中的异常,Raise、Exception

delphi中的异常,Raise、Exception

时间:2024-03-17 10:46:01浏览次数:14  
标签:Exception handling end Raise delphi 处理程序 statements 异常 raise

标准语法

 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

相关文章

  • Delphi提高开发效率之GExperts专家的使用说明
    GExperts是一组通过扩展集成开发环境(IDE)来提高Delphi和C++Builer程序员工作效率的工具。是一款开源的IDE扩展专家,由于去外网下载GExperts非常的麻烦,这里直接提供了Delphi7和Delphi11.1下的GExperts安装包,并连带最新源码一起打包,方便大家使用学习。下面直接看他具有哪些功能,留下实......
  • 猫头虎分享已解决Bug | org.springframework.dao.DuplicateKeyException异常的正确解
    博主猫头虎的技术世界......
  • C#try捕捉不了NullReferenceException
    用debug运行以下代码出现空指针错误double[]EnergyScaleValue=newdouble[3];try{EnergyScaleValue=null;}catch(NullReferenceExceptionee){MessageBox.Show("请先选择样品!");......
  • ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen 硬盘问题
    测试发现嵌入式linuxvfat文件系统的sata固态硬盘偶然启动时出现异常打印如下:ata1.00:exceptionEmask0x0SAct0x8000000SErr0x0action0x6frozenata1.00:failedcommand:READFPDMAQUEUEData1.00:cmd60/08:d8:00:00:00/00:00:00:00:00/40tag27ncq4096in......
  • windbg 调试 c++ std::exception
    由于c++std::exception在windbg里面调用堆栈显示不正确,可以通过加载了系统pdb和软件pdb后,!analyze-v可以分析出来,所有需要配置系统pdb。1、把exe,pdb放到同一个目录下。2、加载dmp文件(拖动dmp文件到windbg)。3、设置pdb路径:File->SymbolFilePath,比如D:\Desktop\3dLayer,记得加......
  • Java 错误 java.net.ConnectException
    本篇文章介绍了Java中的java.net.ConnectException错误。Java中的java.net.ConnectException错误java.net.ConnectException是使用网络时最常见的异常。它主要发生在客户端、应用程序和服务器之间建立TCP连接时。它是一个经过检查的应用程序,可以使用try-cat......
  • Flink实时写Hudi报NumberFormatException异常
    Flink实时写Hudi报NumberFormatException异常问题描述在Flink项目中,针对Hudi表xxxx_table的bucket_write操作由于java.lang.NumberFormatException异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报错如下:bucket_write:......
  • Delphi TDictionary字典类
    TDictionary是一个开放哈希表,支持泛型,并提供了以下常用属性和方法:属性:Count:返回字典中元素的数量。Keys:返回字典中所有键所组成的动态数组。Values:返回字典中所有值所组成的动态数组。方法:Add:向字典中添加一个键和其对应的值。Clear:清空字典中的所有元素。ContainsKey:判断字......
  • 开发中编译时期异常Exception和运行时期异常RuntimeException如何选择
    从实际开发角度来看不管使用哪种都是可以的,业界标准如下如果问题特别严重,开发人员很容易犯,强烈的提醒开发人员注意,那就抛编译时期异常,写完编译不通过就会报错,而后进一步对其处理如果问题不严重,开发人员一般不会出现这种问题,那就抛出运行时期异常,编译通过,后续报错再处理自......
  • [springboot] SpringBoot启动成功后因actuator健康检测报:Redis health check failed/
    0序背景:项目中引入了spring-boot-starter-actuator健康检测模块<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>1问题描述确认微服务刚启动后,因K8S集群周期性定时(默认每隔1......