<?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; }
?> |