【发布时间】: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