有人可以指导我如何实施以及我应该在哪个阶段添加错误处理代码?
网站:
像linkedin这样的社交网络。平台是MySql和codeignitor PHP。
要求:3例错误:
前端像http代码。在这种情况下,用户被重定向到std消息页面。无需捕获数据库。
第二种情况是后端错误,如果服务器耗时太长,错误写入数据库,其他数据库问题,代码爆炸等等。预计用户在所有这些情况下只会看到一个错误消息框“某人已收到通知,请稍后再试“。类似于它在Facebook上的情况,除了facebook根据错误类型有不同的错误文本。
第三种错误类型与会话相关:Cookie在会话期间中断并发生超时,在这种情况下显示请登录消息窗口。
我现在的问题是:
要捕获案例2中的所有各种错误,可以在开发进行的同时完成,或者开发人员必须返回并在每个条目的项目结尾添加错误捕获在代码中指出可能有数百万行代码?
我的团队告诉我他们不知道在案例2中可能发生错误的所有可能情况,直到整个开发完成。但我认为错误哈希码无论如何都是一般的。只有代码添加是我们要捕获的错误类别的错误捕获子句和错误消息,如果不同,可以随时添加,但底层错误代码是相同的,因此甚至可以在开发之前编写它? / p>
如何找到所有可能的情况或捕获所有可能的情况,在案例2中可能发生错误,可能有数百个用户在任何级别爆炸或DB读/写错误等。我们需要为每个代码分别使用单独的代码或共同代码吗?
我的开发人员也是新手,所以我不这么认为任何人都不确定何时以及如何处理网站上的错误处理。在发生错误的系统后端,将向管理员发送一封电子邮件,我正在建立一个错误跟踪系统,以便我们可以自动跟踪后端问题的状态,类型,备注等。
答案 0 :(得分:3)
1.要捕获案例2中的所有各种错误,是否可以在开发过程中完成,或者开发人员必须返回并在每个入口点添加项目结束时的错误捕获在代码中可能有数百万行代码?
两者,但通常只是在开发过程中才需要。实际上至关重要的是要考虑每行代码可以产生哪些类型的错误(特别是如果从外部或数据库源获取数据),因此您需要在每一步中考虑所有这些错误。为了帮助在之后插入特殊情况处理,一切都已就绪,这就是主error handling功能发挥作用的地方。请注意哪些错误级别永远不会触发您的自定义错误处理。您可能也对Exception
class感兴趣。同样,为了更容易插入特殊案例处理,只需要在更少的位置进行更新,将Exception
类扩展到您自己的特殊错误对象中。
2.我的团队告诉我他们不知道在案例2中可能发生错误的所有可能情况,直到整个开发完成。但我认为错误哈希码无论如何都是一般的。只有代码添加是我们要捕获的错误类别的错误捕获子句和错误消息,如果不同,可以随时添加,但底层错误代码是相同的,因此甚至可以在开发之前编写它? / p>
与#1类似的问题。恕我直言,你是对的。在某些情况下,他们也是如此。一个开发人员真的不知道另一个开发人员的代码在看到代码或获取最终文档之前会产生什么类型的错误。
3.如何找到所有可能的情况或捕获所有可能的情况,在情况2中可能发生错误,可能有数百个用户在任何级别爆炸或DB读/写错误等等。我们是否需要单独的代码为每个或共同的代码捕捉所有?
再次关注问题#1,使用自定义错误处理函数或延伸Exception
类(甚至创建单独的类来处理数据库尝试/捕获与文件访问尝试/捕获等),这应该有助于显着。假设您发现了数据库可能出现的新错误。如果已经在try / catch块中包含了连接和查询函数,则只需在扩展的Exception
类中添加处理脚本,而不是在DB函数存在的任何位置。例如,您可以选择为所有数据库连接执行类似的操作。在这种情况下,DB_Exception
是Exception
的扩展版本,它本身可以自行执行任意数量的故障排除任务:
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)