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

liuxy225 2004-12-24 10:42:11
请问Assert()函数是做什么用的?帮助我看不太懂
...全文
874 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
学习!

5,914

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧