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");