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接受两个参数,一个就是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;
Delphi 中ASSERT用法的更多相关文章
- Delphi中Messagedlg用法
if MessageDlg('Welcome to my Delphi application. Exit now?', mtConfirmation, [mbYes, mbNo], 0) = mrY ...
- Delphi中MessageBox用法
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.最简单用法,不带图形 MessageBox(0,'不同意','提示',MB_OK); MessageBo ...
- Delphi中stringlist分割字符串的用法
Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...
- 教程-Delphi中Spcomm使用属性及用法详解
Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...
- Delphi中TxmlDocument控件的用法 转
Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xm ...
- 转delphi中nil的用法
转自:http://blog.csdn.net/haiou327/article/details/6666124 delphi中nil的用法 和C++中的NULL一样的意思,指空值,它和0值不一样-- ...
- Delphi中 StrToIntDef函数的用法
Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...
- delphi中Application.MessageBox函数用法详解
delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...
- Delphi中ClientDataSet的用法小结
Delphi中ClientDataSet的用法小结 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进 ...
随机推荐
- python基础===8道基础知识题
本文转自微信公众号: 2018-03-12 leoxin 菜鸟学Python 原文地址:http://mp.weixin.qq.com/s/JJSDv5YJOZ9e3hn28zWIsQ NO.1 Py ...
- MyEclipse/Eclipse安装插件的几种方式
众所周知MyEclipse是一个很强大的Java IDE,而且它有许多开源免费又好用的插件,这些插件给我们开发过程中带来了许多方便.插件具有针对性,例如,你如果做安卓开发,可能需要一个ADT(Andr ...
- javascript 实现图片拖动
javascript实现图片拖动效果并不难,主要的思路如下 1:给图片绑定监听鼠标按下对象,设置拖动属性为true 2:鼠标抬起:拖动属性为false 鼠标移动:改变坐标即可,新坐标=图片原始坐标+鼠 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记10——三维天空的构建&三维粒子的实现&多游戏模型的载入
第23章 三维天空的构建 目前描述三维天空的技术主要包括三种类型,直接来介绍使用最广泛的模拟技术,详细的描述可以见作者的博文. 天空盒(Sky Box),即放到场景的是一个立方体.它是目前使用最广泛的 ...
- 深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 关于卷积神经网络CNN,网络和文献中 ...
- 树莓派与windows互传文件
这是 meelo 原创的 玩转树莓派 系列文章 安装WinSCP 登录即可在左右两侧分别显示windows和树莓派中的文件 只需将文件从一侧拖到另一侧即可开始文件的传送
- 小米路由器3-R3 刷固件
1.刷机前的路由器升级准备 1-1.首先进入路由器原声后台:miwifi.com 1-2.在右上角,点击系统升级.在系统版本下边选择手动升级,选择资源包里的:“miwifi_r3_all_55ac7_ ...
- C# For Bot Framework
Bot Framework是一个聊天机器人的框架,背后是微软的SDK,它可以使用C#和Nodejs开发,今天我尝试用创建一个比较简单Bot 参考地址:https://docs.microsoft.co ...
- scrapy 安装出错 [err2] no such file or directory: 'README.rst'【已解决】
背景:pip安装一直不成功,很多模块用pip安装都不行,只好到github下载zip安装 c:\Document and settings\> python e:\scrapy-0.24\set ...
- 正对开源工作的源码管理web (ssh协议管理) 本地如何使用SourceTree 管理
入口: 如何产生公钥与私钥 ,以及开源中国 gitweb sshkey 的管理web 地址: 点击 “头像” ,然后再头像下面的列表选择 “ SSH Key Settings” . 接下来,完成跟着步 ...