2011-06-30 139 views
1

我写的函数如果他们不能完成他们的工作就抛出异常。对于生产环境,我认为将异常重定向到一个漂亮的错误页面。因此,我正在考虑在每个脚本的开头设置异常处理程序set_exception_handler。错误页面如何知道发生了哪个错误?我想将一个错误代码放入URL如header("Location: error.php?code=1234")。在开发阶段,我只是不会设置异常处理程序,因此每个异常都会打印到php默认错误屏幕Uncaugt异常:...包含所有有用的信息。PHP异常重定向到自定义错误页面

我已阅读Exceptions in PHP - Try/Catch or set_exception_handler?,但不知道如何编写前端控制器脚本,也认为这可能需要很多努力。

我是一个喜欢以正确的方式处理错误的PHP初学者,但我只是不确定我是对对还是错。你认为没有像上面描述的那样做,或者你有其他建议吗?

谢谢!

回答

2

请勿重定向。在你的异常处理函数中,输出错误页面(或者包含一个包含错误页面HTML的PHP​​文件)。您还想设置适当的状态码(使用PHP标头功能)。

编辑:为什么不重定向:

  • 您想在您的错误页面(通常为404,403,400,500,503取决于原因)返回相应的HTTP状态代码,所以即搜索引擎机器人不知道索引错误,爬虫可以识别破损的页面,浏览器不知道缓存页面等等。如果您重定向,您将返回一个301/302 HTTP状态码,而不是其中的一个。
  • 您希望用户能够刷新页面上的错误,以防万一它是一个暂时的故障。如果你将它们重定向到另一个URL,无论刷新多少次,它们总会看到你的错误页面(因为这是他们所在的页面)。
+0

感谢您的意见。你能告诉我你的经历吗,重定向到错误页面有什么问题?我发现文章[PHP中的集中错误/异常处理](http://codeissue.com/articles/a04e000c369b101/centralized-error-exception-handling-in-php),其中的作者使用重定向方法。 –

+0

我已经给我的答案添加了解释。 –

2

那么告诉你实话我觉得现在为你担心这种事情为时尚早。

现在只是热衷于掌握面向对象,因为以后你会(并可能将不得不)使用MVC框架,它会为你做所有的错误/异常。看看symfony:在开发环境中,它会向您显示异常和堆栈跟踪,但在生产环境中。它吐出一个很好的,可定制的错误页面。

我的意思是:不要重新发明轮子,看看别人如何解决类似的问题。最好使用他们的解决方案(但要记住也要理解它们)。

+0

感谢您的回答!我从symfony那里听说过,并且在一段时间之前安装了它,但从未有效地使用它。我不想重新发明轮子,但对于我正在开展的项目,我认为这是一个矫枉过正的问题。不使用它的主要原因是我必须先学习它(但不幸的是没有时间)。 –

1

你认为这是确定做它像 上述或者你有其他 建议?

不,我不认为这是一个好的解决方案。你不想对每一个出现的问题都应用金锤。一些例外应该与其他例外处理不同。此外,特定的异常可能需要在代码的一部分中以不同于另一部分的方式处理。我建议set_exception_handler作为最后的手段,处理那些由于某种原因未被正确捕获的异常,并且继续编写尝试/捕获以更细粒度地处理事情。

+0

我会牢记这一点。首先,如果出现问题,我尝试通过抛出异常来实现整个功能。后来,如果整个功能都实现了,我会考虑细节和错误条件。感谢您的回答! –

+0

非常欢迎。 – webbiedave

相关问题