【问题标题】:Delphi protect inherited Destrutor from exceptionDelphi 保护继承的 Destrutor 免受异常影响
【发布时间】:2016-05-14 06:19:42
【问题描述】:

我有一个扩展 TFileStream 的 TMyFileStream。

type
   TMyFileStream = class(TFileStream)

在 TMyFileStream.Destroy 中,我有一些用于记录服务器下载的过程。文件流在响应流中传递,当客户端关闭与服务器的连接或终止响应的下载时,对象被破坏并且析构函数日志信息(如字节发送/文件大小)。

此过程可能首先引发异常调用父解构函数。我想保护父析构函数免受子异常的影响。

基本示例

destructor TMyFileStream.Destroy;
begin
   MyExceptionMethod();

   inherited;
end;

我找到的第一个解决方案是首先调用继承的析构函数

destructor TMyFileStream.Destroy;
begin
   inherited;

   MyExceptionMethod();
end;

另一种解决方案是捕获并忽略异常

destructor TMyFileStream.Destroy;
begin
   try
      MyExceptionMethod();
   except
      // nothing
   end;

   inherited;
end;

另一种解决方案是在 finally 中捕获并调用继承的析构函数

destructor TMyFileStream.Destroy;
begin
   try
      try
         MyExceptionMethod();
      except
         // nothing
      end;
   finally
      inherited;
   end;
end;

什么是正确的方法?

【问题讨论】:

  • 不清楚你为什么这样做。你想捕捉构造函数中引发的异常吗?
  • @user246408 不,我在 decostructor 中有一些过程可能会首先引发调用父 decostructor 的异常
  • 请更具体地说明您的实际问题。在祖先之前完成后代的完成是一种典型的完成方式,交换这些操作可能是错误的。
  • 修复你的析构函数,让它不会引发异常,你就不会遇到这个问题。
  • 不,基本的解决方案是不要在析构函数中进行日志记录。析构函数应该释放所有资源并销毁对象。它不应该做各种各样的其他事情。

标签: delphi


【解决方案1】:

另一种方法是覆盖BeforeDestructioninherited 与实例内存的实际解除分配无关。

【讨论】:

  • 如果BeforeDestruction() 引发异常,Destroy() 退出,并且被覆盖的Destroy() 将无法运行其代码或调用inheritedBeforeDestruction() 不受异常保护。
  • 确实,所有相同的问题都适用于 BeforeDestruction。
  • 并非所有问题,特别是预先继承的放置不会导致访问冲突,因为实际的释放就像在 Destroy 中一样。
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2015-11-19
  • 2012-12-20
  • 2023-04-03
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多