gpt4 book ai didi

delphi - 谁负责错误检查和处理?

转载 作者:行者123 更新时间:2023-12-03 15:28:47 26 4
gpt4 key购买 nike

谁负责错误检查和处理?

我没有任何昂贵的组件库,例如 DevExpress 或 TMS Components 等,因此我无法查看源代码来了解大多数组件如何管理错误处理。

具体来说,我想知道的是组件开发人员应该 try catch 的错误和警告数量是否应该受到限制?有意义的错误检查和让开发人员使用组件变得太容易之间是否存在平衡?

<小时/>

以下是使用一些场景的示例:

请注意,这些直接来自组件源(出于示例目的而制作)

procedure TMyComponent.AddFromFile(FileName: string);
begin
FBitmap.LoadFromFile(FileName);
end;

procedure TMyComponent.AddFromFile(FileName: string);
begin
if FileExists(FileName) then
begin
FBitmap.LoadFromFile(FileName);
end
else
raise Exception.Create(FileName + ' does not exist.');
end;

最后两个在运行时使用组件的实例:

procedure TForm1.FormCreate(Sender: TObject);
begin
MyComponent1.AddFromFile('D:\Test.bmp');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if FileExists('D:\Test.bmp') then
begin
MyComponent1.AddFromFile('D:\Test.bmp');
end
else
raise Exception.Create('D:\Test.bmp does not exist.');
end;

我想这取决于谁应该检查错误并处理什么?是组件开发人员负责处理这些类型的检查还是组件的用户负责?

在我撰写本文时,我相信组件开发人员和用户都应该处理此类检查,但我不确定,因此我正在寻找开发人员之间的普遍共识。

谢谢。

最佳答案

回答您的具体问题:

Specifically what I am wanting to know is should there be a limit to how many errors and warnings component developers should try to capture? Is there a balance between having meaningful error checking and just making it too easy for developers using your component?

关于异常处理的一般规则是,您应该只捕获您知道如何处理的异常,并让其他人传播到可能知道如何处理它的更高层代码。如果组件内部引发异常,组件需要决定是否:

  1. 在内部处理该特定异常,然后优雅地继续处理其他事情,而无需通知调用者。

  2. 重新抛出异常(可能对其进行调整),或者重新抛出一个全新的异常,以允许调用者识别并处理特定的失败(如果需要)。

    <
  3. 忽略异常(根本不捕获它)并让它按原样传播。

如果您的组件使用的 API 返回错误代码而不是引发异常,则组件还需要决定如何处理该问题。是忽略错误并继续,还是引发异常以使其更加明显。

在您的特定示例中,我更喜欢以下方法:

type
EMyComponentAddError = class(Exception)
private
FFileName: String;
begin
constructor CreateWithFileName(const AFileName: string);
property FileName: string read FFileName;
end;

constructor EMyComponentAddError.CreateWithFileName(const AFileName: string);
begin
inherited CreateFmt('Unable to add file: %s', [AFileName]);
FFileName := AFileName;
end;

procedure TMyComponent.AddFromFile(FileName: string);
begin
try
FBitmap.LoadFromFile(FileName);
except
Exception.RaiseOuterException(EMyComponentAddError.CreateWithFileName(FileName));
end;
end;

这允许您的组件识别发生了错误,根据需要对其采取行动,并且仍然向调用者报告特定于组件的信息,而不会丢失导致实际故障的原始错误。如果调用者对详细信息感兴趣,它可以捕获异常,查看其 InnerException 属性,访问自定义属性(如果存在)等。

例如:

procedure TForm1.FormCreate(Sender: TObject);
begin
MyComponent1.AddFromFile('D:\Test.bmp');
end;

假设 MyComponent1.AddFromFile('D:\Test.bmp'); 失败。默认异常处理程序将捕获它并显示一条弹出消息:

Unable to add file: D:\Test.bmp

有用,但细节很少,因为它可能因多种原因而失败。也许该文件无法打开,但为什么呢?不存在 vs 没有权限?也许文件已打开但已损坏?也许内存无法分配?等等。

如果需要,调用者可以捕获它并显示更多有用的信息(这不是必需的 - 组件提供信息,调用者决定是否使用它):

procedure TForm1.FormCreate(Sender: TObject);
begin
try
MyComponent1.AddFromFile('D:\Test.bmp');
except
on E: EMyComponentAddError do
begin
ShowMessage('There was a problem adding a file:'+sLineBreak+E.FileName+sLineBreak+sLineBreak+E.InnerException.Message);
Sysutils.Abort;
end;
end;
end;

或者:

procedure TForm1.FormCreate(Sender: TObject);
begin
try
MyComponent1.AddFromFile('D:\Test.bmp');
except
on E: EMyComponentAddError do
begin
raise Exception.CreateFmt('There was a problem adding a file:'#10'%s'#10#10'%s', [E.FileName, E.InnerException.Message]);
end;
end;
end;

其中任何一个都会显示:

There was a problem adding a file:
D:\Test.bmp
The file was not found

关于delphi - 谁负责错误检查和处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24806510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com