1

我发现在链接类函数方面有一些有限的用途,比如说$class->setUser('foo')->getInfo()(坏例子),尽管我无法理解如何处理由链中的一个调用引起的任何错误。

例如,如果setUser()出现错误并返回 false,它将不会返回$this并且不允许调用另一个函数,从而显示错误。

我实际上刚刚意识到(如果这是错误的,请纠正我),如果出现错误以setUser()防止以下getInfo()函数运行并发出错误,会抛出异常吗?

至少拥有这将是有用的知识,因此即使我不使用链接,我也可以调试使用链接的代码。

4

2 回答 2

3

是的,在这种情况下,抛出异常可能是个好主意。您将能够查明错误在链中发生的位置。

这是一个如何工作的示例:

try
{
    $class->setUser('foo')->getInfo();
}
catch(UnknownUser $ex)
{
    // setUser failed
}
catch(CannotFetchInfo $ex)
{
    // getInfo failed
}
于 2011-06-03T21:43:21.070 回答
1

与任何链条一样:如果一个元素损坏,则整个链条都会损坏。

因此,如果您正在链接对象,一方面这可能非常容易访问,另一方面如果由于错误(例如远程连接、文件等)而导致失败,则链接变得很尴尬。

因此,除非事情没有返回预期的响应类型而是发出失败的信号,否则异常可能会有所帮助,但是 - 随着链的中断 - 的使用是有限的。

但是,我认为抛出异常是错误处理(在链中开发自己的代码)中可以做的最好的事情。

抛出异常的好处如下:您不需要破坏使链可访问的语法。

假设您在代码中犯了错误。最好抛出异常,因为无论如何您都需要修复它。

或者假设数据层已经被编码,它经常失败。抛出一个异常,你就知道需要更多爱的部分了。

在具有链接的通用代码中,这些异常会打断你(你总是可以捕获它们,顺便说一句,你也可以将错误变成异常),但它们会指出你可能没有的错误原因想的已经够多了。

所以,

  1. 异常是链的一种错误处理方式
  2. 异常可帮助您定位各种错误来源,同时您可以维护链式语法以进行更高级别的数据访问。

然而,无论链接做得多么好,都会出现它不再有意义的地步(我应该添加“与所有内容一样”;))。我不会说我是一个真正的链接迷,但即使作为一个非迷,我也会不时在我自己的代码中使用这个原则。它可以创建易于编写的代码,因此使用异常进行错误处理,我没有遇到任何“真正的”(tm)问题。这比用虚假或类似的废话打破你的链条要好得多。

从理论上讲,您可以通过重载返回一个接受任何属性/成员调用 set/get 的对象,但即使这很有趣,我认为它只会引入更多的复杂性,而不是有助于处理实际的现实生活中的错误。

因此,如果您链​​接到错误中,您实际上会在使用异常时看到错误。这就是例外情况:由于错误(或信号,也可以)而中断应用程序的标准处理。

于 2011-06-03T22:02:22.127 回答