什么时候提出例外?

时间:2019-04-28 15:24:04

标签: delphi

我认为这是“最佳实践”类别的问题:

我有一个自定义控件-一种可容纳某些面板的网格。面板之一是当前活动面板(最后一个单击)。

TMyGrid = class (TSomeKindOfGrid)
  published
    property CurrentPanel: TPanel read getCurPanel write setCurPanel;
end;

我的问题是:如果某个时候有人要求CurrentPanel并且网格为空,getCurPanel应该返回NIL还是引发异常?

  • 如果getCurPanel返回NIL,则我必须在每次/每次致电CurrentPanel时都要检查NIL。呼叫者也有可能忘记检查NIL。好吧,因为它将尝试访问NIL对象,所以不会发生任何“不良”情况。该程序将很好地崩溃。我得到了堆栈跟踪。
  • 如果我在getCurPanel中引发异常,我只会在一个地方进行检查(是的,我很懒)。

1 个答案:

答案 0 :(得分:5)

如果您返回nil,则可以使用户有机会检查返回值,并跳过他或她打算对当前面板执行的任何操作:

panel := XYZ.currentPanel;
if Assigned(panel) and (panel.Index = 17) then
begin

上面的代码运行没有任何不必要的中断。

如果立即提出异常,则不会给用户提供任何机会来发现是否存在当前面板。换句话说,引发异常将为时过早。与上面相同的代码会崩溃。

但是我承认这是我的个人喜好(可能是很多,但不是全部)。这是见仁见智。


但是,除了返回nil之外,您还可以公开一个PanelCount属性。如果人们需要检查类似的东西,那么如果计数为零,那么如果有人试图访问面板,您也可以提出建议。那还不早。


如您所见,有几种方法可以做到这一点。

注意

正如SilverWarrior在注释中正确注意到的那样,currentPanel是一个已发布属性,该属性最终将出现在“对象检查器”中。这样可以处理返回nil的属性,但不一定处理引发异常的属性。

所以:最好的建议是返回nil