php7 相比 5.6,对于异常和错误作了一些改进,原来的一些 fatal error 在 7.0 之后版本都被做为 error 抛出,可使用 try-catch 进行捕获处理。php
感受 php 中对于 error 和 exception 的定义比较模糊json
<?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");