PHP7 錯誤及異常機制

關鍵詞

  • error 不能在編譯期發現的運行期錯誤,好比試圖用 echo 輸出一個未賦值的變量,這類問題每每致使程序或邏輯沒法繼續下去而須要中斷;
  • exception 程序執行過程當中出現意料以外的狀況,邏輯上每每是行得通的,但不符合應用場景,好比接收到一個長度超出預約格式的用戶命名,所以,異常主要靠編碼人員作預先作判斷後拋出,捕獲異常後改變程序流程來處理這些狀況,沒必要中斷程序。
  • error_reporting 設置錯誤的報告級別,返回給客戶端
  • display_errors 設置是否將錯誤展現給客戶端
  • log_errors 設置是否記錄錯誤日誌
  • error_log 設置錯誤日誌記錄路徑
  • try-catch
  • trigger_error 用戶主動觸發的錯誤
  • set_error_handler 自定義 error 處理邏輯,能夠捕獲絕大部分的 error,若是自定義函數 return false,則處理邏輯結束後,程序是否結束取決於 error 的狀況(便是否繼續執行取決於其餘設置),若是不 return false,則處理邏輯結束後,程序正常運行 error 以後的代碼。可是如下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT。
  • set_exception_handler 自定義 exception 的處理邏輯,當發現某個 exception 沒有被 catch 的時候,就會調用這個函數,無論這個自定義的異常處理邏輯運行情況如何,在異常處理完以後,程序必定會被中斷
  • register_shutdown_function 自定義的程序結束邏輯處理,無論是否正常結束,是否進入了 set_error_handler 和 set_exception_handler 都將在程序結束前執行這段自定義邏輯,未捕獲的 error(通常未捕獲的 error 都會致使程序中斷),能夠在這裏進行處理

概述

php7 相比 5.6,對於異常和錯誤作了一些改進,原來的一些 fatal error 在 7.0 之後版本都被做爲 error 拋出,可使用 try-catch 進行捕獲處理。php

感受 php 中對於 error 和 exception 的定義比較模糊json

一段測試 php7 的異常處理邏輯代碼

<?php
/**
 * test.php
 */
function getBackTraceStr() {
    ob_start();
    debug_print_backtrace();
    $trace = ob_get_contents();
    ob_end_clean();

    return $trace;
}

function _exceptionHandler($e) {
    var_dump($e);
}

function check_for_fatal()
{
    var_dump("end");
    $error = error_get_last();
    var_dump($error);
}

function _errorHandler($errNo, $errStr, $errFile, $errLine) {
    var_dump($errNo);
    var_dump($errStr);
    var_dump($errFile);
    var_dump($errLine);
    $trace = getBackTraceStr();
    var_dump($trace);
    throw new ErrorException($errStr, 0, $errNo, $errFile, $errLine);
}

set_error_handler("_errorHandler");
set_exception_handler("_exceptionHandler");
register_shutdown_function("check_for_fatal");
error_reporting(E_USER_ERROR);
error_reporting(E_ALL);
ini_set('display_errors', "on");
ini_set('log_errors', "on");

var_dump(error_reporting());

$a = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED;

$b = 1 % 0;

try {
$a->nonexist();
$b = 1 / 0;
trigger_error("fuck", E_USER_ERROR);
throw new Exception("abc");
} catch(Throwable $e) {
    var_dump($e);
}
trigger_error("fuck", E_USER_ERROR);
require("abc.json");
throw new Exception("abc");
noexist(3, 54);
try {
require("abc.json");
} catch (Error $e) {
  var_dump("what");
}
define("hello", 1);
define("hello", 1);

var_dump("a");
相關文章
相關標籤/搜索