Php 动态网站出现未知错误时的最佳做法?

Php 动态网站出现未知错误时的最佳做法?,php,error-handling,user-interface,Php,Error Handling,User Interface,我有一个PHP站点(和其他站点一样)有一些隐藏的错误。问题是发生错误时应该发生什么 我看到很多PHP和其他网站,如果出现错误,页面会有点破损,有时甚至会将内部错误消息转储到页面,但通常该网站保持部分可用性 我遵循的另一种方法是立即终止页面呈现,并向用户显示错误消息 你认为哪一种方法更方便用户?让应用程序继续运行而不考虑错误,这样页面的某些部分仍然可以呈现和使用?或者立即终止控制流,因为向用户显示一个不完整的页面更糟糕,而应该显示一条正确的错误消息 更新:不是关于404页面,而是关于那些页面被发现

我有一个PHP站点(和其他站点一样)有一些隐藏的错误。问题是发生错误时应该发生什么

我看到很多PHP和其他网站,如果出现错误,页面会有点破损,有时甚至会将内部错误消息转储到页面,但通常该网站保持部分可用性

我遵循的另一种方法是立即终止页面呈现,并向用户显示错误消息

你认为哪一种方法更方便用户?让应用程序继续运行而不考虑错误,这样页面的某些部分仍然可以呈现和使用?或者立即终止控制流,因为向用户显示一个不完整的页面更糟糕,而应该显示一条正确的错误消息


更新:不是关于404页面,而是关于那些页面被发现时的情况,而是在生成过程中出现的问题。

我喜欢让服务器处理所有404和500503等。。。并自动将用户指向带有Oops的漂亮页面!保持站点导航完整的消息,以便他/她可以从此处导航。另外,我喜欢添加一个返回按钮(一个javascript history.go(-1):尽管人们对这种方法有着复杂的感觉

如果您不知道如何添加apache服务器错误重定向,请查看

无论如何,根据定义,当发生未知错误时,它是未知的。因此,您不应该自动知道该怎么办

最好的方法是显示一条漂亮的错误消息(每个框架都支持在出现错误时显示特定的内容)


当然,你也应该给自己发送一封电子邮件,以便跟踪并纠正这些错误。

PHP在
E_ERROR
E_WARNING
级别的消息之间有所不同(在许多其他级别中,这些消息可能是最常见的两种)。在PHP的默认行为中,
E_ERROR
level errors将停止脚本的所有进一步执行,而
E_WARNING
level警告只会在继续之前抛出

正如上面所解释的,这是有原因的;一般来说,致命错误就是这样,并且不应该试图继续脚本执行,即使使用自定义错误处理程序是可能的。致命错误是希望的-非常罕见,但是当一个被抛出时,我认为最好的做法是终止和显示一个清晰的ME。对用户来说是一个无益的错误

不过,警告应该采用不同的方法;因为它们不是致命的,也不会终止执行,所以您只需记录错误,或者向用户显示一个小警告,指示页面的哪些部分无法正确显示,然后继续运行脚本即可

不过我建议不要向用户显示PHP的默认错误/警告消息。这些消息不专业、难看,可能会让更多恶意用户了解您网站的数据库和文件结构

TL;DR version:坚持PHP的默认行为,但始终将错误处理程序更改为更明显的方式


编辑:我误读了问题的一部分,并没有真正得到“未知”部分。尽管如此,我的答案仍然有效;只要错误不是致命的(即没有完全中断脚本的流程),就没有理由停止执行。错误会影响脚本的其余部分(即阻止查询所有内容的数据库错误)应该像处理
e_错误那样处理。

这是一个一般性问题,不仅仅限于PHP

您不应该显示未完成的页面。如果某个页面出现错误,用户无法使用该页面(原因无关紧要),则必须显示错误页面。如果该页面存在您已经考虑过的错误,例如无法获取的RSS提要,则继续显示该页面的工作部分

另一方面,如果在处理过程中出现错误——同样,原因也不重要——您可以向用户指出错误并让他们重试

在RubyonRails中,我们总是准备在处理错误(包括验证问题)后重新显示页面


这都是常识,但请记住,99%的错误来源不明(由统计数据组成,但基本正确),但好的软件会对这些错误做出优雅的反应(从用户角度来看)。

我非常喜欢框架实践来显示“内部错误”页面和电子邮件回溯以及其他调试信息返回给我。这可能是让我解决问题的最佳方法(尤其是在不容易复制的情况下)

我想说警告可能同样糟糕,因为如果没有声明变量,而是使用了变量,那么输出可能会令人困惑或胡言乱语。我通常也会以致命错误消息终止这些警告。虽然我不确定这是正确的方法,但我无法区分显示结果致命的警告和不会引起太多问题的警告ms在页面渲染中的应用。