Php 异常捕获:何时不捕获它们?

Php 异常捕获:何时不捕获它们?,php,oop,zend-framework,exception,Php,Oop,Zend Framework,Exception,我在PHP的Zend框架中为我的应用程序编写了许多小库(一堆类)。我还在库的方法本身中捕获这些异常,并将它们记录到一个文件中 然后突然我遇到了一个问题,就是使用这些库的主应用程序不会因为错误而退出,即使在我希望它们因为致命错误而退出的情况下也是如此。问题是下面的代码一直执行到最后——这是不应该的 在库类中捕获并记录大多数错误(特殊情况除外)似乎不是一个好的做法。他们应该总是按原样抛出错误?这是正确的假设吗 如果有人能帮我回答这个问题,我将不胜感激。捕获并处理所有异常是个好主意。如果您不确定是否可

我在PHP的Zend框架中为我的应用程序编写了许多小库(一堆类)。我还在库的方法本身中捕获这些异常,并将它们记录到一个文件中

然后突然我遇到了一个问题,就是使用这些库的主应用程序不会因为错误而退出,即使在我希望它们因为致命错误而退出的情况下也是如此。问题是下面的代码一直执行到最后——这是不应该的

在库类中捕获并记录大多数错误(特殊情况除外)似乎不是一个好的做法。他们应该总是按原样抛出错误?这是正确的假设吗


如果有人能帮我回答这个问题,我将不胜感激。

捕获并处理所有异常是个好主意。如果您不确定是否可以安全地忽略异常(例如,您自己的代码引发的异常),请显示错误页面。不要简单地重新抛出它,因为没有什么比向用户呈现一个空白页面或web服务器的默认错误页面更糟糕的了,甚至还有一条PHP错误消息。

这取决于网站是在生产中还是已发布的产品。例如,您最不想做的事情就是向用户显示堆栈跟踪。如果您期望出现可能导致致命问题的错误,那么请捕获并处理它。

任何语言中异常的一般原理都是它们传达异常情况。你应该相应地使用它们

如果您最后用
try
块来包围每个函数调用,那么一定是出了问题。异常的设计正是为了使错误处理合乎逻辑,而不需要程序员跟踪所有可能的错误路径。因此,您应该在能够对异常做出有意义的响应的地方准确地捕获异常

如果您想不出比中止并传播错误更好的方法,那么捕获异常就没有意义了。另一方面,如果有一些错误,你可以做出明智的反应,抓住这些错误,然后再重复其他任何错误

一个典型的例子是,如果你正在处理大量的文件。如果解析逻辑中的任何地方出现错误,那么您将无能为力,即使解析可能会导致许多函数调用。但是,在主循环中,您可以
尝试分析每个文件,如果出现异常,您将捕获该异常,跳过该文件并继续下一个文件


如果您正在编写一个库函数,您可能希望在整个函数周围有一个最后的try块;不过,这多少取决于你。只需清楚地记录用户必须从您的库中预期哪些异常。

好的,这意味着我应该设计一个“我的库”模型类,以便调用者知道它是否应该捕获?比方说,我的库不会通过设计捕获任何异常-我只是让调用者/控制器来执行此操作,这是理想的设计吗?@SubratBasnet如果在代码中使用PhpDoc(DocBlocks),则可以使用
@throws
标记。像Java这样的一些语言是“自动”这样做的,因为你必须在你的方法/类前面加上一个“throws”子句,就像你用“extends”子句来扩展一个类一样。比如说,如果我的库都没有捕获任何异常-我只是让我的控制器来捕获,这是一种好方法吗?当我的意思是“按原样抛出错误”时-我并不是说根本不捕获它。我只是让调用者/控制器捕捉错误,而不是在库类中捕捉错误。我正要回答同样的问题,但这很好地解决了这个问题。总之,总是在你可以对异常做点什么的地方处理异常。是的,而且绝对不要试图到处捕捉异常。如果使用C函数返回值之类的异常,则会出现问题。。。