如何使用PHP中的严格报告管理错误?

如何使用PHP中的严格报告管理错误?,php,error-handling,try-catch,error-reporting,Php,Error Handling,Try Catch,Error Reporting,我在PHP中使用一个带有完整错误报告的自定义错误处理程序来跟踪错误。这对于调试非常有用,并将我的所有错误记录在数据库中,以便以后进行调查 无论如何,此方法现在禁用了@的用法,以便在出现错误时忽略错误。我现在有一个问题,我试图在我的系统上重命名一个目录,因为它可能偶尔会抛出一个错误(如果在其中访问文件) 我希望能够在代码中捕获此错误,以防止执行函数的其余部分,但我也不希望此错误出现在错误日志数据库中(考虑到此错误在代码中是“管理的”,因此不需要看到它失败) 有没有简单的解决办法?我尝试使用try/

我在PHP中使用一个带有完整错误报告的自定义错误处理程序来跟踪错误。这对于调试非常有用,并将我的所有错误记录在数据库中,以便以后进行调查

无论如何,此方法现在禁用了
@
的用法,以便在出现错误时忽略错误。我现在有一个问题,我试图在我的系统上重命名一个目录,因为它可能偶尔会抛出一个错误(如果在其中访问文件)

我希望能够在代码中捕获此错误,以防止执行函数的其余部分,但我也不希望此错误出现在错误日志数据库中(考虑到此错误在代码中是“管理的”,因此不需要看到它失败)


有没有简单的解决办法?我尝试使用try/catch,但它仍然会抛出错误。

您可以将所有错误/警告/通知转换为异常

function exceptions_error_handler($severity, $message, $filename, $lineno) {
  if (error_reporting() == 0) {
    return;
  }
  if (error_reporting() & $severity) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
  }
}
set_error_handler('exceptions_error_handler');

我认为处理异常比处理php本机错误更好。

@zerkms的解决方案可以很好地工作,但我的错误处理程序已经完成,因此为了扩展它以提供功能,我只包括:

if ( error_reporting() == 0 )
  return;
在我的处理器开始时。这样,如果在函数上使用了
@
,则仍然会抛出错误,但在处理程序开始时会被忽略(因此,不会登录到数据库等),并且我仍然会从函数中获得布尔结果,例如
rename()


这也使我能够在需要时对代码使用try/catch解决方案。

我可以看到您的try/catch块吗?嗯,谢谢。这是一个进步,但是现在所有的错误都需要使用try/catch,对吗?“我的函数”不再将错误记录到数据库中,因为引发了此异常,因此如果我在脚本中不在任何地方使用try/catch,则不会记录这些错误。@Rhys:这取决于您试图实现的目标。在我的应用程序中,如果错误真的出乎意料,那么它将被捕获在全局try-catch包装器中,在那里它被记录下来,并且在那里我向用户回显某种抱歉页面。若错误是预期的(比如当我们在数据库中得到唯一约束错误时),那个么我将就地处理它,而不记录(因为它不需要记录,因为它是“预期”错误之一)