//例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)并且异常被再引发。这时异常被捕获和处理,通常通过中断程序。

delphi raise 语句: 抛出异常的更多相关文章

  1. 使用raise语句抛出异常

    #_author:来童星#date:2019/12/18def division(): num1=int(input('请输入被除数:')) num2=int(input('请输入除数:')) if ...

  2. raise语句

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python学习手册 868 #raise语句 res=[IndexError,TypeError] #ra ...

  3. delphi if 语句循环语句

    if语句------------------------------------------------------------------------------------------------ ...

  4. C# 自定义异常类 throw语句抛出异常

    Exception概述: 异常(Exception)一般分为两大类SystemException.ApplicationException,前者是预定义的异常类,后者是用户自定义异常类时需要继承的类 ...

  5. Delphi IfThen语句

    function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string; overload; $[StrU ...

  6. Delphi 常用语句

    1.屏蔽Float浮点数出错: Set8087CW(Longword($133f)); 2.Idhttp参数设置: FIdhttp                  := TIdHTTP.Create ...

  7. delphi执行查询语句时的进度条怎么做

    procedure TForm1.FormCreate(Sender: TObject);  begin     ADOQuery1.ExecuteOptions := [eoAsyncFetch]; ...

  8. Delphi SQL语句字符串拼接

    单引号必须成对出现,最外层的单引号表示其内部符号为字符:除最外层以外的单引号,每两个单引号代表一个'字符.加号:+用于字符串之间的连接.字符串常量用四个单引号,例如 ' select * from T ...

  9. Delphi 循环语句和程序的循环结构

随机推荐

  1. 简单混合锁(HybridLock)

    internal sealed class SimpleHybridLock : IDisposable { //基元用户模式构造使用 ; //基元内核模式构造 private AutoResetEv ...

  2. qt qttablewidget

    item setitem 界面显示文件卡住 建议:不要用setitem 应该用insertitem

  3. IntelliJ IDEA导包快捷键

    IntelliJ IDEA导包快捷键 Alt+Enter

  4. SSM框架中使用日志框架

    在 pom,xml 配置 Log4j jar 添加一个 mybatis_log.xml 文件 完整配置信息 <?xml version="1.0" encoding=&quo ...

  5. MariaDB使用enum和set

    1.enum 单选字符串数据类型,适合存储表单界面中的“单选值”. 设定enum的时候,需要给定“固定的几个选项”:存储的时候就只存储其中的一个值. 设定enum的格式: enum("选项1 ...

  6. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  7. Tomcat与Jetty比较

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...

  8. MySQL用户

    创建用户 在对 MySQL 的日常管理和实际操作中,为了避免用户恶意冒名使用 root 账号控制数据库,通常需要创建一系列具备适当权限的账号,应该尽可能地不用或少用 root 账号登录系统,以此来确保 ...

  9. mac 建立 .babellrc 格式文件

    打开MAC的终端: 1   先sudo -s获取最高权限: 2  然后通过cd进入项目所在的路径: 3  接着“vim .babelrc”新建一个.babelrc 文件: 键盘输入”i“进入编辑模式, ...

  10. Confluence 6 评论一个文件

    无论是一个图片 —— 例如一个模拟的新市场计划需要反馈,还是一个 PDF 文件,一个演讲稿,或者任何你可以在 Confluence 中预览的文件.你可以在预览的的任何位置放置一个热点然后添加你的评论后 ...