我正在编写一个在构造函数中从文件(文件中数据的包装器)初始化的类。如果可能的话,应该以读取和写入的方式打开文件,如果不可能,则仅以读取的方式打开。使用这种结构是否正确:
constructor TMyDocument.Create(const AFileName: string);
begin
try
FFile := TFileStream.Create(AFileName, fmOpenReadWrite or fmShareDenyWrite);
Load(FFile);
except
on E: Exception do
if (E is EFOpenError) and (GetLastError = ERROR_ACCESS_DENIED) then
try
FFile := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
Load(FFile);
except
raise;
end
else
raise;
end;
end;
- 没有目标以这样的方式处理异常:如果无法打开文件,则创建一个空对象,并完成构造函数而不会出现错误。处理异常是调用构造函数的人的任务。
- 尝试通过 CreateFile() 打开文件并处理错误代码是否有意义,或者使用 TFileStream 并尝试 except 是否完全可以接受?通过 TStream 进行进一步加载。
- 嵌套的 try except 块中是否有任何点(尝试以只读方式打开文件)?或者这就足够了:
constructor TMyDocument.Create(const AFileName: string);
begin
try
FFile := TFileStream.Create(AFileName, fmOpenReadWrite or fmShareDenyWrite);
Load(FFile);
except
on E: Exception do
if (E is EFOpenError) and (GetLastError = ERROR_ACCESS_DENIED) then
begin
FFile := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
Load(FFile);
end
else
raise;
end;
end;
- - - - - 更新 - - - - - -
结果,我做出了这个决定:
constructor TMyDocument.Create(const AFileName: string);
begin
try
FFile := TFileStream.Create(AFileName, fmOpenReadWrite or fmShareDenyWrite);
except
on E: EFOpenError do
if (GetLastError = ERROR_ACCESS_DENIED) then
FFile := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite)
else
raise;
end;
Load(FFile);
end;