PHP网站上的错误处理

时间:2010-12-19 02:47:20

标签: php mysql error-handling

有人可以指导我如何实施以及我应该在哪个阶段添加错误处理代码?

网站:
像linkedin这样的社交网络。平台是MySql和codeignitor PHP。 要求:3例错误:

  1. 前端像http代码。在这种情况下,用户被重定向到std消息页面。无需捕获数据库。

  2. 第二种情况是后端错误,如果服务器耗时太长,错误写入数据库,其他数据库问题,代码爆炸等等。预计用户在所有这些情况下只会看到一个错误消息框“某人已收到通知,请稍后再试“。类似于它在Facebook上的情况,除了facebook根据错误类型有不同的错误文本。

  3. 第三种错误类型与会话相关:Cookie在会话期间中断并发生超时,在这种情况下显示请登录消息窗口。

  4. 我现在的问题是:

    1. 要捕获案例2中的所有各种错误,可以在开发进行的同时完成,或者开发人员必须返回并在每个条目的项目结尾添加错误捕获在代码中指出可能有数百万行代码?

    2. 我的团队告诉我他们不知道在案例2中可能发生错误的所有可能情况,直到整个开发完成。但我认为错误哈希码无论如何都是一般的。只有代码添加是我们要捕获的错误类别的错误捕获子句和错误消息,如果不同,可以随时添加,但底层错误代码是相同的,因此甚至可以在开发之前编写它? / p>

    3. 如何找到所有可能的情况或捕获所有可能的情况,在案例2中可能发生错误,可能有数百个用户在任何级别爆炸或DB读/写错误等。我们需要为每个代码分别使用单独的代码或共同代码吗?

    4. 我的开发人员也是新手,所以我不这么认为任何人都不确定何时以及如何处理网站上的错误处理。在发生错误的系统后端,将向管理员发送一封电子邮件,我正在建立一个错误跟踪系统,以便我们可以自动跟踪后端问题的状态,类型,备注等。

2 个答案:

答案 0 :(得分:3)

  

1.要捕获案例2中的所有各种错误,是否可以在开发过程中完成,或者开发人员必须返回并在每个入口点添加项目结束时的错误捕获在代码中可能有数百万行代码?

两者,但通常只是在开发过程中才需要。实际上至关重要的是要考虑每行代码可以产生哪些类型的错误(特别是如果从外部或数据库源获取数据),因此您需要在每一步中考虑所有这些错误。为了帮助在之后插入特殊情况处理,一切都已就绪,这就是主error handling功能发挥作用的地方。请注意哪些错误级别永远不会触发您的自定义错误处理。您可能也对Exception class感兴趣。同样,为了更容易插入特殊案例处理,只需要在更少的位置进行更新,将Exception类扩展到您自己的特殊错误对象中。

  

2.我的团队告诉我他们不知道在案例2中可能发生错误的所有可能情况,直到整个开发完成。但我认为错误哈希码无论如何都是一般的。只有代码添加是我们要捕获的错误类别的错误捕获子句和错误消息,如果不同,可以随时添加,但底层错误代码是相同的,因此甚至可以在开发之前编写它? / p>

与#1类似的问题。恕我直言,你是对的。在某些情况下,他们也是如此。一个开发人员真的不知道另一个开发人员的代码在看到代码或获取最终文档之前会产生什么类型的错误。

  

3.如何找到所有可能的情况或捕获所有可能的情况,在情况2中可能发生错误,可能有数百个用户在任何级别爆炸或DB读/写错误等等。我们是否需要单独的代码为每个或共同的代码捕捉所有?

再次关注问题#1,使用自定义错误处理函数或延伸Exception类(甚至创建单独的类来处理数据库尝试/捕获与文件访问尝试/捕获等),这应该有助于显着。假设您发现了数据库可能出现的新错误。如果已经在try / catch块中包含了连接和查询函数,则只需在扩展的Exception类中添加处理脚本,而不是在DB函数存在的任何位置。例如,您可以选择为所有数据库连接执行类似的操作。在这种情况下,DB_ExceptionException的扩展版本,它本身可以自行执行任意数量的故障排除任务:

function db_connect() {
    $MySQLi = new mysqli(DB_HOST, DB_USERNAME, DB_PW, DB_NAME, DB_PORT, DB_SOCKET);
    if ($MySQLi->connect_error) throw new DB_Exception($MySQLi->connect_error);
    if ($MySQLi->error) throw new DB_Exception($MySQLi->error);
    return $MySQLi;
    }

try {$MySQLi = db_connect();}
catch (DB_Exception $e) {if (!$e->is_fixed_now) die($e->special_message);}

您还可以让扩展的Exception类引用由$code构造参数枚举的一组预设响应。但是,你真的应该尝试对你可能得到的每个可能的数据库错误应用特殊的错误处理。它可以提高效率,减少大部分时间的负担,只需抓取MySQL错误文本,然后将其转发给您的管理员。

至于您向用户显示的文字,最好始终保持简单和信息丰富,同时绝对不要对网站的内部工作情况进行任何分析。示例:您的数据库服务器崩溃或有人错误地设置了文件权限:您应该告诉用户“抱歉,技术问题,此特定内容暂时无法使用,我们的工作人员已收到通知,请稍后再试。如果紧急电子邮件如此@ so.com或致电555-1212支持。“您也可以根据Exception $code参数执行预制消息,与上述相同,但在发生站点攻击时不提供任何帮助。

此外,“在发生错误时系统的后端,电子邮件将发送给管理员”实际上并不是一个好主意。用户可能只是坐在那里一遍又一遍地刷新,直到它神奇地再次开始工作。您很容易陷入电子邮件风暴中。一种可能的解决方案是运行10分钟的cron作业检查以查看错误日志是否在过去10分钟内已被修改,并通过电子邮件发送新日志条目的摘要。或者,如果您有故障单系统,只有在主题上没有打开的故障单时才会打开错误脚本。

答案 1 :(得分:0)

  1. 应为您希望生成的HTTP错误提供适当的错误页面。这些页面应提供有关错误的最小数据,并指示用户的适当重试/后续操作。再回到安全区域的更多链接通常是合适的。
  2. 完整列表将被称为开发进度。这对任何施工过程都是正常的。任何在代码中无法纠正的操作都应由您的页面生成代码处理。这些可以通过记录和生成适当的HTTP错误页面来处理(已经在处理1中完成)。按类而不是特定的错误条件处理错误是合适的。除非用户可以自行更正,否则不应向用户报告实际错误情况。
  3. 对所有错误使用常见的catch代码并按错误类进行响应。在许多/大多数情况下,您将需要在错误日志中生成堆栈跟踪。生成适当的HTTP错误代码以供显示。查看HTTP规范以获取要使用的相应HTTP响应。
  4. 表单验证是一个单独的类别,应在验证输入时进行适当处理。这将导致重新显示页面并嵌入相应的错误消息。