什么时候提出例外?

问题描述 投票:1回答:1

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

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

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

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

  • 如果getCurPanel返回NIL,那么我必须在每次/每次调用CurrentPanel时检查NIL。呼叫者也有可能忘记检查NIL。好吧,没有什么“坏”会发生,因为它会尝试访问NIL对象。该程序将在那里很好地崩溃。我得到一个堆栈跟踪。
  • 如果我在getCurPanel中引发异常,我只在一个地方进行检查(是的,我很懒)。
delphi
1个回答
5
投票

如果您返回nil,您可以让用户检查返回值并跳过他或她打算对当前面板做的任何事情:

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

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

如果您立即提出异常,则不会让用户有机会查明是否有当前面板。换句话说,提出例外还为时过早。与上面相同的代码将会爆炸。

但我承认这是我个人的偏好(可能是许多,但不是全部)。这是一个意见问题。


但是,你可以暴露一个nil财产,而不是返回一个PanelCount。如果人们有这样的东西要检查,如果有人试图访问一个面板,如果count为零,你也可以提高。那么现在还不成熟。


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

Note

正如SilverWarrior在评论中正确注意到的那样,currentPanel是一个已发布的属性,最终将出现在Object Inspector中。这可以处理返回nil的属性,但不一定是抛出异常的属性。

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

© www.soinside.com 2019 - 2024. All rights reserved.