DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lixuan123
今日帖子: 20
在线用户: 7
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 smallmouse (小老鼠) ★☆☆☆☆ -
普通会员
2004/4/21 22:28:21
标题:
raise的作用是什么? 浏览:1229
加入我的收藏
楼主:
老师:
  您好!
书中有这样一段代码:其中,qyProduct是TQuery组件,Database1是TDatabase组件
procedure TForm1.sbPostClick;
begin
 Database1.StartTransaction;
 try
   qyProduct.ApplyUpdates;
   qyProduct.CommitUpdates;
   Database1.Commit;
 except
   qyProduct.CancelUpdates;
   Database1.Rollback;
   raise;
 end;
end;
  这段代码是关于“交易控制”的代码,我对其中的raise指令有些不清楚。书中虽然对它进行了一些介绍,但我还是有些不明白,所以贴出来,请老师指教。
书中的讲解:调用raise指令,把try与except间的错误产生的异常再引发一次,最后停止这段程序的运行。而对于“再引发一次”,书中也做了解释:因为系统只要发生异常,那一段过程的程序就会中止。可是当使用“try ... except”后,系统除了会显示一个异常错误信息外,不会继续行为表现下运行,所以就把这个错误再引发一次,让程序中止,还要再往下进行。
  
  我不懂的地方:
  使用“try ... except”后,当“保存数据”的代码出错,程序就会运行except块内的Rollback方法将所有需要保存数据的操作复原到开始交易前的状态。
  我认为即使不加raise指令,当发生异常时,也一定会执行except块内的语句,而执行完Rollback后,程序也一定会中止运行,因为Rollback后已经没有代码了。那么既然又可以复原回以前的状态,又可以中止程序的运行,又何必去调用raise指令呢?这是不是有点画蛇添足呢?请老师指教。

 
 

----------------------------------------------
-
作者:
男 zpeihe (stanley) ★☆☆☆☆ -
盒子活跃会员
2004/4/22 0:32:54
1楼: 我也同感。
----------------------------------------------
I just loving Delphi
作者:
男 cjrb (Thinking In 魂) ★☆☆☆☆ -
盒子活跃会员
2004/4/22 1:16:56
2楼: 你运行这三个就知道有没有差了。
1:
  try
    StrToInt('a');
  except
    //raise;
    exit;
  end;
2:
  try
    StrToInt('a');
  except
    raise;
    exit;
  end;
3:
  try
    StrToInt('a');
  except
    raise Exception.Create('转换出错');
    exit;
  end;
----------------------------------------------
按此在新窗口浏览图片 充电..........
作者:
男 zpeihe (stanley) ★☆☆☆☆ -
盒子活跃会员
2004/4/22 21:12:36
3楼: 明白,谢谢CJRB!
----------------------------------------------
I just loving Delphi
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行117.1875毫秒 RSS