PHP:如何优雅地管理错误?

时间:2010-03-02 12:04:51

标签: php error-handling

如果无法访问Web上的内容(api,数据库),我将如何停止执行脚本的其余部分并将错误记录在日志文件中?嗯,所以访问者不会看到确切的原因,而是他们会看到我的自定义消息(例如,'一件坏事刚刚发生')。我需要采取哪些步骤来安排事情?

2 个答案:

答案 0 :(得分:11)

在这种情况下,我通常喜欢使用Exceptions:它允许我在一个地方拥有所有错误处理代码。


例如,我会使用类似这样的东西:

try {
    // Some code

    // Some code that throws an exception

    // Some other code -- will not be executed when there's been an Exception

} catch (Exception $e) {
    // Log the technical error to file / database

    // Display a nice error message
}

这样,所有错误处理代码都在catch块中 - 而不是在我的整个应用程序中分散。


但请注意,许多PHP函数不会抛出异常,只会引发警告或错误......

对于那些,您可以使用set_error_handler来定义自己的错误处理程序 - 这可能会抛出异常;-)
例如,请参阅manual page of ErrorException上的示例。

虽然这对许多错误/警告都有效,但您应该注意它不适用于Parse ErrorFatal Error

  • 第一种实际上是在实际执行PHP代码之前引发的
  • 第二种是......好吧......致命。


我绝不会在代码中间放置任何dieexit:在我看来,这是处理错误的最糟糕方式之一。

我还要配置我的服务器/应用程序:

答案 1 :(得分:3)

  

所以访客不会看到   确切的原因,但他们会   看我的自定义消息

我建议你在 custom error handling in PHP 上阅读David Walsh撰写的这篇优秀文章。

您可以使用 set_error_handler() 功能。

  

我将如何停止执行其余的   脚本并记录错误   日志文件?

PHP有一个默认函数来记录错误;的 error_log

来自PHP.net的示例:

<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
    exit; //exit
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

更多资源:

<强> This is also good article covering most of it related to error handling.