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

时间:2014-09-02 08:00:34

标签: php mysql

在我的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的开头就足够了吗?
  • 此解决方案的一个缺点当然是如果数据库关闭则无法获得通知。在这种情况下,如何获得通知电子邮件?

2 个答案:

答案 0 :(得分:1)

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

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

注意: 这不会捕获致命错误。要处理致命问题,我会使用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页面。

答案 1 :(得分:0)