PHP異常的捕獲及處理

系統(tǒng)自帶異常處理

<?php
header("Content-type:text/html;charset=utf-8");
try
{
    //業(yè)務(wù)處理 錯誤時拋出異常。
    $age = 130;
    if ($age > 120) {
        throw new Exception('年齡不能大于120歲。', 1001);
    }
} catch (Exception $e) {
    $err = [
        'code' => $e->getCode(),
        'msg'  => $e->getMessage(),
        'file'    => $e->getFile(),
        'line'   => $e->getLine()
    ];
    echo json_encode($err);
}

輸出:{"code":1001,"msg":"\u5e74\u9f84\u4e0d\u80fd\u5927\u4e8e120\u5c81\u3002","file":"\/data\/mi\/demo.php","line":11}

自定義異常處理

<?php
header("Content-type:text/html;charset=utf-8");
class proException extends Exception
{
    //根據(jù)業(yè)務(wù)需求,自定義方法
    /**
     * 獲取錯誤信息
     * @param int $type 類型 1=json 2=數(shù)組
     * @return array
     */
    public function getErrorInfo($type = 2)
    {
        $err = [
            'code' => $this->getCode(),
            'msg'  => $this->getMessage(),
            'file'    => $this->getFile(),
            'line'   => $this->getLine()
        ];
        if ($type == 1) {
            return json_encode($err);
        }
        return $err;
    }
}

try
{
    //業(yè)務(wù)處理 錯誤時拋出異常。
    $age = 130;
    if ($age > 120) {
        throw new proException('年齡不能大于120歲。', 1001);
    }
} catch (proException $e) {
    $info = $e->getErrorInfo();
    var_dump($info);
}

輸出:array(4) { ["code"]=> int(1001) ["msg"]=> string(27) "年齡不能大于120歲。" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(53) }

捕捉多個異常

<?php
header("Content-type:text/html;charset=utf-8");
class proException extends Exception
{
    //根據(jù)業(yè)務(wù)需求,自定義錯誤方法

    /**
     * 獲取錯誤信息
     * @param int $type 類型 1=json 2=數(shù)組
     * @return array
     */
    public function getErrorInfo($type = 2)
    {
        $err = [
            'code' => $this->getCode(),
            'msg'  => $this->getMessage(),
            'file'    => $this->getFile(),
            'line'   => $this->getLine()
        ];
        if ($type == 1) {
            return json_encode($err);
        }
        return $err;
    }
}

try
{
    if ($_GET['age'] > 100) {
        throw new proException('自定義的異常處理', 1002);
    } else {
        throw new Exception('系統(tǒng)的異常處理', 1002);
    }
} catch (proException $e) {
    $info =  $e->getErrorInfo();
    var_dump($info);
} catch (Exception $e) {
    echo $e->getMessage();
}

?age=110 輸出:array(4) { ["code"]=> int(1002) ["msg"]=> string(24) "自定義的異常處理" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(64) }
?age=20 輸出:系統(tǒng)的異常處理。

日志記錄

//禁止錯誤輸出
error_reporting(0);
//設(shè)置錯誤處理器
set_error_handler('errorHandler');
//在腳本結(jié)束時運(yùn)行的函數(shù)
register_shutdown_function('fatalErrorHandler');

/**
 * 錯誤處理
 * @param int    $err_no      錯誤代碼
 * @param string $err_msg  錯誤信息
 * @param string $err_file    錯誤文件
 * @param int    $err_line     錯誤行號
 * @return string
 */
function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0)
{
    $log = [
        '['.date('Y-m-d h-i-s').']',
        '|',
        $err_no,
        '|',
        $err_msg,
        '|',
        $err_file,
        '|',
        $err_line
    ];
    $log_path = '/data/mi/test.txt';
    error_log(implode(' ',$log)."\r\n",3, $log_path);
    //echo implode(' ',$log)."<br>";
}

/**
 * 捕捉致命錯誤
 * @return string
 */
function fatalErrorHandler() {
    $e = error_get_last();
    switch ($e['type']) {
        case 1:
            errorHandler($e['type'], $e['message'], $e['file'], $e['line']);
            break;
    }
}

class DemoClass_1
{
    public function index()
    {
        //這里發(fā)生一個警告錯誤,出發(fā)errorHandler
        echo $undefinedVarible;
    }
}

$demo_1 = new DemoClass_1();
//這里發(fā)生一個警告錯誤,被errorHandler 捕獲
$demo_1->index();
//發(fā)生致命錯誤,腳本停止運(yùn)行觸發(fā) fatalErrorHandler
$demo_2 = new DemoClass_2();
$demo_2->index();

打開echo后 輸出:
[2016-08-07 09-01-34] | 8 | Undefined variable: undefinedVarible | /data/mi/demo.php | 126
[2016-08-07 09-01-34] | 1 | Class 'DemoClass_2' not found | /data/mi/demo.php | 134

備注:

  • register_shutdown_function 也可以用于API調(diào)試中,記錄每次請求值和返回值,方便調(diào)試。
  • 利用 “|” 分割的好處是,便于利用 awk 對日志進(jìn)行分割處理。

Thanks ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,269評論 2 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,276評論 6 342
  • 個人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,992評論 0 11
  • 我,不會問,不會提,難過了,就一個人不停的走。 我,不會哭,不會笑,很累了,就讓我消失一下吧。 這條路,我一個人走...
    Kayan阿嘉閱讀 756評論 0 20

友情鏈接更多精彩內(nèi)容