PHP:函数脚本中的现代错误处理


PHP: Modern error handling in functions script

在我的functions.php中,我的网站页面模板中使用了一组函数。我想知道处理错误的最佳方法是什么。目前,我的functions.php看起来是这样的:

// include database
require_once 'system/db.php';
// Functions
// =========
function getUrlsPhotos($db, $resultId) {
    $query = "SELECT * FROM pictures WHERE result_id=$resultID ORDER BY id ASC";
    $results = $db -> query($query);
    // Was there an error?
    if ($db -> error) {
        $output = 'error_getting_photos';
    } else {
        // loop for getting photos... ... ...
        $output = $array_photos;
    }
    return $output;
}
function getActivityName($db, $activitiesId) {
    $query = "SELECT * FROM activities WHERE id=$activitiesId LIMIT 1";
    $results = $db -> query($query);
    if ($db -> error) {
        $output = 'db_error_getting_activityname';
    } else {
        $result = $results -> fetch_assoc();
        $output = $result;
    }
    return $output;
}

我的目标是在用户没有看到的情况下,以某种方式查看是否发生了错误。对于我的所有功能,处理错误的有效方法是什么?我需要初始化什么?

---编辑:---

阅读了更多关于错误处理的内容,我想出了以下用于在数据库中存储错误的脚本:

    <?php
function errorHandler($errno, $errstr, $errfile, $errline) {
    static $db;
    if (empty($db)) {
        $db = new PDO(DSN, DBUSER, DBPASS);
    }
    $query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
    $stmt = $db->prepare($query);
    switch ($errno) {
        case E_NOTICE:
        case E_USER_NOTICE:
        case E_DEPRECATED:
        case E_USER_DEPRECATED:
        case E_STRICT:
            $stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
            break;
        case E_WARNING:
        case E_USER_WARNING:
            $stmt->execute(array("WARNING", $errstr, $errfile, $errline));
            break;
        case E_ERROR:
        case E_USER_ERROR:
            $stmt->execute(array("FATAL", $errstr, $errfile, $errline));
            exit("FATAL error $errstr at $errfile:$errline");
        default:
            exit("Unknown error at $errfile:$errline");
    }
}
set_error_handler("errorHandler");

我的问题:

  • 为了对我的所有php函数都有效,这个错误处理函数最好放在哪里?把它放在我的functions.php的开头就足够了吗
  • 这种解决方案的一个缺点肯定是,如果数据库出现故障,就无法得到通知。例如,在这种情况下,我如何获得通知电子邮件

使用set_error_handler并创建一个(理想情况下,但不是必需的)类来处理错误。

set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR);

注意:这不会捕获FATAL。为了处理FATAL,我会使用register_shutdown_function()

你的课应该是这样的;

<?php
class ErrorHandling  {
    //Methods need to be static
    public static function doHandleErrors($strErrorCode, $strErrorMsg, $strErrorFile, $intErrorLine) {
        //Handle errors.
        //Depending on the $strErrorCode, you would either display the message, or display a http status code 500 & direct to a 500 error page.
        //Depending on the severity of the error, e-mail your programmers.
        //Try not to display any errors to the consumer/user
        //Make the error something like "Ooops, something went wrong." and not "An error occured on file.php, line 23."
        //But that may be more a question for UX.se
    }
}

为了对我的所有php函数都有效,这个错误处理函数最好放在哪里?把它放在我的functions.php的开头就足够了吗

我会在建立数据库连接之前,将set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR);放在您的主"大脑文件"中,这样我们就可以使用您的自定义错误处理程序来处理数据库连接问题。

此解决方案的一个缺点是,如果数据库关闭,则无法获得通知。例如,在这种情况下,我如何获得通知电子邮件

使用自定义错误处理程序,您可以捕获错误/异常并向程序员发送电子邮件,然后优雅地终止进程,向最终用户显示500 Internal Server Error503 Service Unavailable页面。

您可以在php中使用set_error_handler进行自定义错误处理

检查更多

http://php.net/manual/en/function.set-error-handler.php

http://www.sitepoint.com/error-handling-in-php/

PHP:自定义错误处理程序-处理解析&致命错误