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");
相关文章
相关标签/搜索