「PHP開發APP接口實戰003」自定義異常處理

在實際開發中,錯誤及異常捕捉僅僅靠try{}catch()是遠遠不夠的。
為了安全起見,我們使用了兩個PHP內置方法 set_error_handlerset_exception_handler 繞過標準的 PHP 錯誤處理函數,并輸出自定義錯誤消息和記錄錯誤日志。

記錄錯誤日志

為了方便調試和查找錯誤位置,我們在每次攔截到錯誤信息時,都會將錯誤信息記錄在日志文件里面。

/**
 * 記錄錯誤日志
 * @param $error_code 錯誤代碼
 * @param $error_message 錯誤消息
 * @param $error_file 錯誤文件
 * @param $error_line 錯誤行
 */
function log_write($error_code, $error_message, $error_file, $error_line)
{
    $log = date('Y-m-d H:i:s');
    $log .= ' | ' . '[' . $error_code . '] ';
    $log .= $error_message . PHP_EOL;
    $log .= $error_file . ', line : ' . $error_line . PHP_EOL;
    $filename = LOG_PATH . '/' . date('Ymd') . '.log';
    file_put_contents($filename, $log . PHP_EOL, FILE_APPEND);
}

錯誤信息包括:錯誤時間,錯誤信息,錯誤文件,錯誤所在行。例如:

2017-12-14 06:42:45 | [2] Division by zero
D:\Fox\DingDangBike\Code\app\1.0.0\controllers\IndexController.php, line : 7

輸出錯誤信息

/**
 * 輸出錯誤信息
 * @param $message 錯誤消息
 * @param $code 錯誤代碼
 * @param string $track 錯誤位置
 */
function error_output($message, $code, $track = null)
{
    $error = [
        'status' => '0',
        'code' => $code . '',
        'message' => $message,
    ];

    $options = null;
    $config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
    // 調試開啟
    if ($config->debug && $track) {
        $error['track'] = $track; // 輸出出錯位置信息
        $options = $options | JSON_UNESCAPED_UNICODE; // 中文不轉碼
    }
    die(json_encode($error, $options));
}

我們將攔截到的錯誤信息封裝成標準JSON接口格式,再輸出到接口頁面并終止代碼執行。
這里,我們還配置了是否開啟調試,如開啟調試功能,會額外輸入錯誤位置信息,以便于開發時調試使用。例如:

{
    "status": "0",
    "code": "500",
    "message": "Division by zero",
    "track": "D:\\Fox\\DingDangBike\\Code\\app\\controllers\\IndexController.php, line : 17"
}

自定義錯誤處理函數

使用內置函數set_error_handler攔截錯誤, 并調用log_writeerror_output

set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
    log_write($error_code, $error_message, $error_file, $error_line);
    error_output($error_message, 500, $error_file . ', line : ' . $error_line);
});

自定義異常處理函數

使用內置函數set_exception_handler攔截異常, 并調用log_writeerror_output

set_exception_handler(function (Exception $e) {
    log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
    error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
});

完整代碼

路徑:/public/exception.php

<?php
/**
 * 記錄錯誤日志
 * @param $error_code 錯誤代碼
 * @param $error_message 錯誤消息
 * @param $error_file 錯誤文件
 * @param $error_line 錯誤行
 */
function log_write($error_code, $error_message, $error_file, $error_line)
{
    $log = date('Y-m-d H:i:s');
    $log .= ' | ' . '[' . $error_code . '] ';
    $log .= $error_message . PHP_EOL;
    $log .= $error_file . ', line : ' . $error_line . PHP_EOL;
    $filename = LOG_PATH . '/' . date('Ymd') . '.log';
    file_put_contents($filename, $log . PHP_EOL, FILE_APPEND);
}

/**
 * 輸出錯誤信息
 * @param $message 錯誤消息
 * @param $code 錯誤代碼
 * @param string $track 錯誤位置
 */
function error_output($message, $code, $track = null)
{
    $error = [
        'status' => '0',
        'code' => $code . '',
        'message' => $message,
    ];

    $options = null;
    $config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
    // 調試開啟
    if ($config->debug && $track) {
        $error['track'] = $track; // 輸出出錯位置信息
        $options = $options | JSON_UNESCAPED_UNICODE; // 中文不轉碼
    }
    die(json_encode($error, $options));
}

set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
    log_write($error_code, $error_message, $error_file, $error_line);
    error_output($error_message, 500, $error_file . ', line : ' . $error_line);
});

set_exception_handler(function (Exception $e) {
    log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
    error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • php.ini設置,上傳大文件: post_max_size = 128Mupload_max_filesize ...
    bycall閱讀 6,829評論 3 64
  • 前言 最近項目中有一個功能需要實現:調試模式下, 將所有錯誤提前輸出, 再輸出頁面內容. 為實現上述功能, 需使用...
    MinkChannel閱讀 1,917評論 1 15
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 簡介 PHP提供了錯誤處理和日志記錄的功能. 這些函數允許你定義自己的錯誤處理規則,以及修改錯誤記錄的方式. 這樣...
    零一間閱讀 668評論 0 2
  • 姓名:李俊秀 公司:寧波大發化纖有限公司 期數:六項精進259期學員 組別:感謝一組 【日精進打卡第81天】 【知...
    花語花香9閱讀 179評論 0 0