什么时候错误检查太多了?

Sam*_*Sam 5 php error-handling

在我的PHP学习过程中,我一直在尝试阅读错误报告和处理的最佳实践,但语句因人而异,我一直在努力想出一种清晰简洁的方法来处理我的应用程序中的错误.我对可能出错的事情使用异常,但在大多数情况下,我很难理解异常是否应该杀死应用程序并显示错误页面或者只是被捕获并静默处理.

似乎无法回避的事情是,有太多的报道吗?每次你调用一个函数都会出现可怕的错误,这意味着如果你要确认每一个函数调用,你将不得不用if语句填充页面,并找出其中一个失败可能产生的影响.有错误报告的简明文档或想法可以为我清除这一点吗?有最佳做法吗?良好错误处理的最佳示例是什么?

目前我做以下事情:

  • 如果发生致命错误,请将重要事件结果添加到要记录的数组并通过电子邮件发送给我
  • 显示致命错误的抽象/一般错误.
  • 对可能失败的案例使用例外
  • 打开开发环境中的错误报告,关闭实时环境
  • 验证所有用户输入数据
  • 清理无效的用户输入
  • 向用户显示简明,信息丰富的错误消息,而无需提供利用平台.

Sho*_*hoe 3

恕我直言,异常是您唯一不理解的事情:异常意味着超出您的控制范围,意味着从抛出它们的范围之外捕获并处理。try 块有一个特定的限制:它应该包含相关操作。以数据库 try catch 块为例:

$array = array();
try {
    // connect throws exception on fail
    // query throws exception on fail
    // fetch results into $array
} catch (...) {
    $array[0]['default'] = 'me';
    $array[0]['default2'] = ...;
    ...
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我将每个与数据库相关的函数都放在了 try 块中。如果连接失败,则查询并且不会执行获取,因为如果没有连接,它们就没有任何意义。如果查询失败,则会跳过获取,因为获取没有结果是没有意义的。如果出现任何问题,我有一个空的 $array 需要处理:这样我就可以用默认数据填充它。

使用异常,例如:

$array = array();
try {
    if (!file_exists('file.php')) throw new Exception('file does not exists');
    include('file.php');
} catch (Exception $e) {
    trigger_error($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)

没有意义。它只是一个更长的版本:

if (!file_exists('file.php')) trigger_error('file does not exists');
    include('file.php');
Run Code Online (Sandbox Code Playgroud)

  • @Sam,结论是:异常应该只停止 `try {}` 块内的内容并在 `catch()` 中处理。仅当您想要停止正在运行的流程时才应使用“trigger_error”。至少这是他们的目的。那么显然你可以对它们做任何你想做的事。 (2认同)