//例1:
begin
  raise Exception.Create('抛出异常');
end;
//例2:
begin
  raise Exception.CreateFmt('%s %d', ['错误代码:', 999]);
end;

//例3:
var
  exc: Exception;
begin
  exc := Exception.Create('发现异常');
  raise exc;

end;

引发和处理异常

要创建一个异常对象,应在raise语句中调用异常类的构造器,如

raise EMathError.Create;

一般情况下,raise具有如下形式

raise object at address

这里的object和at address都是可选的。如果object被省略,那么语句将再引发当前异常(见再引发异常)。当某个address被指定时,通常是一个指向过程或函数的指针;利用该选项可以从堆栈中较早的点(与错误实际发生的点比较)引发异常。

异常被引发,即异常在raise语句中被引用时,异常由特殊的异常处理逻辑来管理。通常,raise语句从不返回控制。取而代之的是,它把控制传递到最内层的异常处理程序,该处理程序能处理给定类的异常。(最内层的处理程序就是一个try...except块中尚未退出的最近入口。)

例如,下面的函数把一个串转换为整数,如果结果在指定范围之外则引发一个ERangeError异常。

function StrToIntRange(const S: string; Min, Max: Longint): Longint;

begin

Result := StrToInt(S);  // StrToInt函数在SysUtils单元中定义

if (Result < Min) or (Result > Max) then

raise ERangeError.CreateFmt(

'%d is not within the valid range of %d..%d',

[Result, Min, Max]);

end;

可以注意到,在raise语句中调用的是CreateFmt方法。Exception类及其后裔类拥有特殊的构造器,为创建异常消息和环境ID提供多于一种途径。

引发的异常在其处理后自动销毁,决不要试图人为销毁一个引发的异常。

注意:单元的初始化节中引发异常不能达到预期的结果。一般的异常支持来自SysUtils单元,在异常支持可用之前该单元必需被初始化。如果一个异常在初始化过程中发生,那么包括SysUtils单元在内所有初始化过的单元,都会被结束(finalized)并且异常被再引发。这时异常被捕获和处理,通常通过中断程序。

最新文章

  1. iOS打包ipa给客户测试流程
  2. HTML 5 代码
  3. SSIS-包调用包错误的解决方案
  4. SQLServer查询所有库表结构信息
  5. STL--迭代器(iterator)
  6. jira-cli,api,git,jenkins--version.txt
  7. FJNU 1154 Fat Brother And His Love(胖哥与女神)
  8. CAS 在 Tomcat 中实现单点登录
  9. android开发之SwipeListView的使用
  10. keydown和keypress
  11. T4模板使用技巧
  12. 突破IP限制动态替换代理ip。
  13. 程序开发:MVC设计模式与应用
  14. 【JAVAWEB学习笔记】09_MySQL多表&amp;JDBC(包含MySQL数据库思维导图)
  15. Mysql分页查询性能分析
  16. apue——无缓冲读写操作
  17. 【Apache Kafka】Kafka学习笔记
  18. C# 动态加载程序集信息
  19. (整理)在REHL6.5上部署ASP.NET MVC
  20. HNOI2018简要题解

热门文章

  1. Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法
  2. 网络协议相关面试问题-https加密算法相关面试问题
  3. LeetCode01 - 两数之和(Java 实现)
  4. MyBatis---join 查询
  5. inner join和left join
  6. JavaWeb-SpringSecurity记住我功能
  7. Hbase底层解析
  8. hadoop+zookeeper+hbase伪分布式安装
  9. [CSP-S模拟测试]:最大或(数学)
  10. linux 上修改了nginx.conf 怎么重新加载配置文件生效