<?php
/**
* PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。平时遇到的warming、notice都是错误,只是级别不同而已。
* PHP异常:一般是业务逻辑上出现的不合预期、与正常流程不同的状况,不是语法错误。
*
* PHP无法自动捕获错误和异常,以下实例运行,直接报错
* try {
* echo $ary[0];
* } catch (Exception $e) {
* echo $e->getMessage();
* }
*
* 必须要自己抛出异常,如下就可以了
* try {
* if(isset($ary)){
* echo $ary[0];
* }else{
* Throw new Exception('此函数不存在',400);
* }
* } catch (Exception $e) {
* echo $e->getMessage();
* }
*
* 手动抛出异常实在是不实用,怎么进行自动捕获错误和异常呢?使用set_exception_handler()
* set_exception_handler('_exception_handler');
* function _exception_handler(Throwable $e){
* if ($e instanceof Error) {
* echo "catch Error: " . $e->getCode() . ' ' . $e->getMessage() . '<br>';
* } else {
* echo "catch Exception: " . $e->getCode() . ' ' . $e->getMessage() . '<br>';
* }
* }
* foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误
* throw new Exception('This is a exception', 400); //抛出一个Exception
*
* 自动捕获错误,使用set_error_handler()
* set_error_handler('_error_handler', E_ALL | E_STRICT);
* function _error_handler($errno, $errstr, $errfile, $errline)
* {
* echo "错误编号errno: $errno<br>";
* echo "错误信息errstr: $errstr<br>";
* echo "出错文件errfile: $errfile<br>";
* echo "出错行号errline: $errline<br>";
* }
* echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误
*
* 但以下级别的错误不能由用户定义的函数来处理:
* E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING,
* 和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
* 捕获Fatal Error错误
* ExceptionDemo.php 代码如下
* ExceptionDemo1.php
* error_reporting(0);
* require './ExceptionDemo.php';
* require './ExceptionDemo2.php'; //ExceptionDemo1.php 本身语法并没有出错,也就是在parse-time的时候并没有出错,而是require文件时出错了,也就是在run-time的时候出错了,这个时候是能回调 register_shutdown_function()中的函数的。
* ExceptionDemo2.php
* function test(){}
* function test(){} //访问ExceptionDemo2.php文件时,php的语法解析器在parse-time的时候就出错了,不能回调register_shutdown_function()中的方法
*
*/
register_shutdown_function("fatal_handler");
set_error_handler("error_handler");
define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);
//获取 fatal error
function fatal_handler()
{
$error = error_get_last();
if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
$errno = $error["type"];
$errfile = $error["file"];
$errline = $error["line"];
$errstr = $error["message"];
error_handler($errno, $errstr, $errfile, $errline);
}
}
//获取所有的 error
function error_handler($errno, $errstr, $errfile, $errline)
{
$str = <<<EOF
"errno":$errno
"errstr":$errstr
"errfile":$errfile
"errline":$errline
EOF;
//获取到错误可以自己处理,比如记 Log、报警等等
echo $str;
}
?>