zoukankan      html  css  js  c++  java
  • delphi raise 语句: 抛出异常

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

  • 相关阅读:
    19. 删除链表的倒数第 N 个结点
    相交链表
    环形链表2
    环形链表
    K8s 网络通讯
    Hutool-二维码生成
    Hutool-加解密
    Hutool-解析JSON
    Hutool-读取配置文件中的配置
    Hutool-操作图片
  • 原文地址:https://www.cnblogs.com/jijm123/p/11010309.html
Copyright © 2011-2022 走看看