zoukankan      html  css  js  c++  java
  • Delphi 中ASSERT用法

    http://blog.csdn.net/dongyonggan/article/details/5780979

    用法:ASSERT(表达式)

    如果为假,ASSERT会产生一个EASSERTIONFAiled异常,显示为

    Assertion Failed (C:/src/unit1.pas, [size=+0]line 34)

    如果不想再使用这些检查时,可以使用($ASSERTIONS OFF)或($C-)编译指令

    要想使Assert在整个项目中失效, 关闭Project Options | Compiler | Assertion 选项。

    delphi assert()函数的用法
    assert(断言)的作用是用来进行条件测试。可以计算表达式 expression ,

    如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

    缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

    用法总结与注意事项:

    1)在函数开始处检验传入参数的合法性
    2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
    3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题。
    4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

    5)有的地方,assert不能代替条件过滤

    请问Assert()函数是做什么用的?

    表示断言某一件事,肯定某一件事,是一种调试辅助手段,当断言被违反时,则表明编码或者设计错误(通常是表明编码错误)。

    assert接受两个参数,一个就是bool值,另一个是如果违反了断言将会产生的异常的字面,异常字面值可以省略,

    比如

    procedure TForm1.SomeMethod(aParam1: Pointer);
    begin
      //按照设计,aParam1不能为nil
      Asssert(aParam1 <> nil, 'aParam1不能为nil');
      //或者
      Asssert(aParam1 <> nil);

      //也可以断言,在执行SomeMethod,TForm1必定处于某种状态
      Asssert(not Visible);

      ...
    end;

    上面的代码相当于:

    procedure TForm1.SomeMethod(aParam1: Pointer);
    begin
      {$IFOPT ASSERTIONS}
      //按照设计,aParam1不能为nil
      if not (aParam <> nil) then
         AssertErrorProc('aParam1不能为nil', UnitName, LineNumber, ErrorAddr);
      //或者
      if not (aParam <> nil) then
         AssertErrorProc('', UnitName, LineNumber, ErrorAddr);
      //也可以断言,在执行SomeMethod,TForm1必定处于某种状态
      if not (not Visible) then
         AssertErrorProc('', UnitName, LineNumber, ErrorAddr);  
      {$IFEND}

      ...
    end;

    需要注意,不能用Assert代替raise exception,assert不是代码的一部分,

    也就是,可以通过调整编译选项,使得最终目标代码中不包含assert的bool表达式的计算,

    也就是整个assert函数被去掉

    所以需要明确这点,虽然有些语句是属于对系统状态的断言,但是违反却不是编码造成的,

    比如用户输入了不是期望的字符串,那么此时不能用assert,而应该用判断+raise exception

    In Delphi code, use Assert as a debugging tool to test that conditions assumed to be true are never violated.

    Assert provides an opportunity to intercept an unexpected condition

    and halt a program rather than allow execution to continue under unanticipated conditions. 

    Assert takes a Boolean expression and an optional message string as parameters.

    If the Boolean test fails, Assert raises an EAssertionFailed exception.

    If a message string was passed to Assert, the exception object is created with that string.

    Otherwise it is created with a default string indicating that the assertion failed.

    The message is displayed along with the complete path, filename, and the line number on which Assert failed. 

    The SysUtils unit causes runtime errors to be turned into exceptions.

    If SysUtils is not used anywhere in your application, you will get a runtime error 227

    rather than an EAssertionFailed exception.

    This runtime error will halt the program. 

    Because assertions are not usually used in shipping versions of a product,

    compiler directives are provided to disable the generation of assertion code: 

    $ASSERTIONS ON/OFF(long form) 

    $C +/-(short form) 

    These are global switches that affect the entire source file where they occur,

    regardless of their position in the file.

    It is not possible to enable and disable assertions for something smaller than a source file.

    Assertions are on by default.  

    {
    This example exercises the System Assert function.  The first
    call passes and the second call fails.
    }
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
      TStorage = class(TObject)
        FData: string;
        property Data: string read FData write FData;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
      var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure ModifyStorage(AStorage: TStorage; const s: string);
    begin
      Assert(AStorage <> nil, '');
      AStorage.Data := s;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Storage: TStorage;
    begin
      Storage := TStorage.Create;
      try
        ModifyStorage(Storage, 'Hello world');
      finally
        Storage.Free;
      end;
    
      // The following call is buggy and triggers the Assert
      ModifyStorage(nil, 'Ooops');
    end;
  • 相关阅读:
    年度回忆录(?——2011.01)
    我在学英语
    技能冷却
    抗锯齿
    在cocos2dx 2.x FPS 等参数
    手指效果
    cocos2dx 简单OpenGL 画图
    cocos2dx tile map瓦片地图的黑线及地图抖动解决方案
    C++操作SQLite数据库
    精灵点击移动
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4021005.html
Copyright © 2011-2022 走看看