我在PHP的Zend Framework中为我的应用程序编写了一些小型库(一堆类)。我也一直在库的方法本身中捕获这些异常并将它们记录到文件中。
然后我突然遇到了一个问题,即使用这些库的主要应用程序由于错误而不会因为错误而退出,即使在我希望它们因致命错误而退出的情况下也是如此。这个问题是下面的代码一直执行到最后 - 它不应该有。
看起来捕获并且可能记录库类中的大多数错误(特殊情况除外)似乎不是一个好习惯。他们应该总是抛出错误吗?这是一个正确的假设吗?
如果有人能为我解答,我会很感激。
答案 0 :(得分:6)
在任何语言中,例外的一般哲学是他们传达特殊情况。你应该相应地使用它们。
如果您最终使用try
块围绕每个函数调用,那么就会出现问题。异常被精确设计为使错误处理成为逻辑,而不需要程序员跟踪所有可能的错误路径。因此,您应该在对其进行有意义的响应的那些点上精确捕获异常。
如果你想不出更好的事情而不是中止和传播错误,那么抓住异常就没有意义了。另一方面,如果有一些错误,你可以做出明智的反应,抓住那些错误,并重新抛出其他任何错误。
一个典型的例子是你正在处理大量文件。如果解析逻辑中的任何地方都出现错误,那么即使解析可能会导致许多函数调用失败,也无法做任何事情。但是,在主循环中,您可以try
解析每个文件,如果有异常,则捕获该文件,跳过该文件并继续下一个文件。
如果您正在编写库函数,您可能希望在整个函数周围放置一个最终的try块;但是,这有点取决于你。只需清楚地记录用户对您的库有哪些例外。
答案 1 :(得分:4)
捕获和处理所有异常是一个好主意。如果您不确定异常是否可以安全忽略(例如,您自己的代码抛出的异常),则显示错误页面。不要简单地重新抛出它,因为没有什么比向用户呈现空白页面或网络服务器的默认错误页面 - 甚至PHP错误消息更糟糕的了。
答案 2 :(得分:0)
这取决于网站是在生产中还是已发布的产品。您要做的最后一件事是向用户显示堆栈跟踪。如果你期望一个可能导致致命问题的错误,那就赶上并处理它。