Delphi异常处理

amfer 2014-05-25 10:54:03
Delphi可以这样抛出异常吗?

try
...
except
on E: exception do
begin
...
raise E; //另一种写法:raise Exception.Create(E.Message);
end;
end;

为什么问这个问题是因为两个事件里都用了raise E这种写法,在第一个事件中抛出异常后同时被第二个事件捕获异常并同时也做了一次raise E,此时出现内存错误,应该是E这个对象已经不存在了,改为raise Exception.Create(E.Message)正常,不清楚Delphi是如何处理对象释放的,那么是不是保险起见都不要用raise E这种写法?
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
amfer 2014-05-27
  • 打赏
  • 举报
回复
追问一句:只用raise后,异常抛到外面,什么时候被释放?
amfer 2014-05-27
  • 打赏
  • 举报
回复
那直接raise有对应的错误信息吗?比如错误码,类型及消息?
武稀松 2014-05-26
  • 打赏
  • 举报
回复
实际上你那个E的生存周期就是在触发异常开始,在except的end结束. except的end会调用system单元的_HandleOnException或_DoneExcept.在这个里面会把异常类自动释放掉. 否则异常类不就算是内存泄露了? 但是有一个诀窍,就是直接调用raise这时不会触发_HandleOnException或_DoneExcept.这两个函数.而是用_RaiseAgain直接把except里面的异常抛到外边. try ... except on E: exception do begin ... raise; //看这一行 end; end;
amfer 2014-05-26
  • 打赏
  • 举报
回复
答非所问
lyhoo163 2014-05-26
  • 打赏
  • 举报
回复
try .... // 正常语句 except .... // 异常处理语句 end; 处理对象释放,应使用下列语句 try .... // 正常语句 finally .... // 处理语句 end 这一语句,不管异常保护的程序块是否发生错误,最终都要执行finally与end之间的程序,以便进行必要的异常处理或释放资源。 之间是正常的受到异常保护的程序,except与end之间是异常处理程序。

5,388

社区成员

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

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