• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

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

liuxy225 2004-12-24 10:42:11
请问Assert()函数是做什么用的?帮助我看不太懂
...全文
391 点赞 收藏 4
写回复
4 条回复
alphax 2004年12月24日
是的,上面的“相当于”的代码已经说得很清楚了,不要光问,其他的动手试一下就知道了
回复 点赞
liuxy225 2004年12月24日
那就是说不满足Asssert(aParam1 <> nil);的话就会引发一个错误了?
回复 点赞
alphax 2004年12月24日
表示断言某一件事,肯定某一件事,是一种调试辅助手段,当断言被违反时,则表明编码或者设计错误(通常是表明编码错误)。

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
回复 点赞
g961681 2004年12月24日
学习!
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1474

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告