请问 except 里的语法

jimmygump 2003-08-24 12:09:28
我看 except 里都是
try

except
on E:MyExcept1 do
begin
……
……
end;
on E:MyExcept2
begin
….
….
end;
else
begin
…..
……
end
end;

我有一个疑问, 如果我不论发生什幺问题都要做的事, 应该放哪儿好? 例如: 不论是 MyExcept1, MyExcept2, 或是 else 都得先 adoConnection1.RollbackTrans, 然后再做个别处理。

我现在好象放不进去一个点啊, 每一小块 begin end 都写进一句 RollbackTrans
, Object Pascal 行不行啊?
...全文
38 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimmygump 2003-08-26
  • 打赏
  • 举报
回复
搞个两层吧, 搭配 re-raise 让外层去 Rollback
这样是达成 “只写一次 Rollback” 的目的, 可反过来说, 效能或许变差

procedure TForm1.Button1Click(Sender: TObject);
begin
//这里模仿 BeginTrans
Label1.Caption := 'Original';
try
try
//以下各阶段的 raise 是为了测试,就自己 raise 了,用意是模仿内部错误
Label1.Caption := Label1.Caption + '1'; //模仿数据库一连串的动作
if edit1.Text = 'Edit1' then
raise E1.Create('You must input something'); //模仿内部拋出

Label1.Caption := Label1.Caption + '2';
if edit1.Text = '123' then
raise E2.Create('I know the one input 123 must be a lazy guy');
//模仿内部拋出

Label1.Caption := Label1.Caption + '3';
if edit1.Text = 'fuck' then
raise Exception.Create('hey...you shouldn''t say this'); //模仿内部拋出

//这里模仿 CommitTrans
Label1.Caption := Label1.Caption + '...all pass, you input ' + Edit1.Text;
except
on E: E1 do
begin
Label2.Caption := E.Message;
raise;
end;
on E: E2 do
begin
Label2.Caption := 'Better than not: ' + E.Message;
raise;
end;
else
begin
//这里通常就做 Error Log 了, 等候下一版编程时再加 on E: XXX do
Label2.Caption := 'exceptions that not yet predicted in design-time';
raise;
end;
end;
except
//这里模仿 RollbackTrans
Label1.Caption := 'Original';
end;
end;
jimmygump 2003-08-26
  • 打赏
  • 举报
回复
让我发挥点想象空间…..我好想要 Object Pascal 的 except 区块能够像一般的 begin end 区块一样:

try
……
except
begin
………… <<<<<< 在这里 Rollback
on E: E1 do
begin
…..
end;
on E: E2 do
begin
…..
end;
………… <<<<<< 这里也还能做点什么
end;
else
……. <<<<<< 在这里也 Rollback
……
end;

呵呵呵, 纯粹想象, 目前 Object Pascal 没办法这样 :P

jimmygump 2003-08-26
  • 打赏
  • 举报
回复
路人…我目前正是每一块都加, 但我总觉得这样不是很优雅啦 :P

凶狠汤…主题是有很多个 on E: XXXX 都要 Rollback, 而且重点是都还有各自的程序小段要依例外型别做不同处理, 不是不区分例外的。

判官…except 和 finally 是不能在同一个 try 使用的


xuejinlong 2003-08-24
  • 打赏
  • 举报
回复
finally里面呀
xgc521 2003-08-24
  • 打赏
  • 举报
回复
每一小块 begin end 都写进一句 RollbackTrans
Object Pascal 完全可以
zousoft 2003-08-24
  • 打赏
  • 举报
回复
with DataBase1 do
begin
StartTransaction;
try
...
Commit;
except
Rollback;
end;
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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