在php.ini中设置
display_errors
是否开启PHP输出错误报告的功能。值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)ini_set()
动态设置php.ini配置文件.如:ini_set(“display_errors”,“On”); //显示所有错误信息error_reporting
: 设置不同的错误报告级别。error_reporting = E_ALL & ~E_NOTICE
可以抛出任何非注意的错误,默认值error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
只考虑致命的运行时错误、新解析错误和核心错误。error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
报告除用户导致的错误之外的所有错误。如下所示:php.ini的设置
error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_log=1024 // 每个日志项的最大长度
error_log=G:/myerror.log //指定错误写进的文件
在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);
<html>
<head><title>测试错误报告</title></head>
<body>
<h2>测试错误报告</h2>
/*开启php.ini中的display_errors指令,只有该指令开启如果有错误报告才输出*/
ini_set('display_errors', 1);
/*通过error_reporting()函数设置在本脚本中,输出所有级别的错误报告*/
error_reporting( E_ALL );
/*“注意(notice)”的报告,不会阻止脚本的执行,并且可能不一定是一个问题 */
getType( $var ); //调用函数时提供的参数变量没有在之前声明
/*“警告(warning)”的报告,指示一个问题,但是不会阻止脚本的执行 */
getType(); //调用函数时没有提供必要的参数
/*“错误(error)”的报告,它会终止程序,脚本不会再向下执行 */
get_Type(); //调用一个没有被定义的函数
?>
</body>
</html>
error_reporting(E_ALL & ~E_NOTICE);
getType($a);
echo "1111111111111111
";
getType();
echo "222222222222222222222
";
getType3();
echo "333333333333333333333
";
自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理。
使用set_error_handler()函数来设置用户自定义错误处理。
/**
* 定义Error_Handler函数,作为set_error_handler()的第一个参数"回调"
* @param int $error_level 错误级别
* @param string $error_message 错误信息
* @param string $file 错误所在文件
* @param int $lin 错误所在行数
*/
function error_handler($error_level,$error_message, $file, $line) {
$EXIT = FALSE;
switch( $error_level ) {
//提醒级别
case E_NOTICE:
case E_USER_NOTICE :
$error_type = 'Notice'; break;
//警告级别
case E_WARNING:
case E_USER_WARNING:
$error_type = 'Warning'; break;
//错误级别
case E_ERROR:
case E_USER_ERROR:
$error_type = 'Fatal Error';
$EXIT = TRUE; break;
//其他末知错误
default:
$error_type = 'Unknown';
$EXIT = TRUE; break;
}
//直接打印错误信息,也可以写文件或数据库
printf ("%s: %s in %s on line %d
\n", $error_type, $error_message, $file, $line);
//若出现错误则跳转到友好错误提示页面
if(TRUE === $EXIT) {
echo '';
}
}
//屏蔽程序中的错误
error_reporting(0);
//把错误的处理交给error_handler()
set_error_handler('error_handler');
//使用末定义的变量要报 notice 的
echo $novar;
//除以0要报警告的
echo 3/0;
//自定义一个错误
trigger_error('Trigger a fatal error', E_USER_ERROR);
注意E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用原始的方式显示,不过通常情况下不会发生。
header("Content-type:text/html;charset=utf8");
// error_reporting(E_ALL & ~E_NOTICE);
//在php中注册一个函数, 来处理错误报告, 而不按原来的方式处理了
set_error_handler("myerrorfun");
$mess = "";
//自己的错误报告处理函数
function myerrorfun($error_type, $error_message, $error_file, $error_line) {
global $mess;
$mess.="发生错误级别为{$error_type}类型, 错误消息{$error_message}, 在文件{$error_file}中, 第{$error_line}行。
";
}
getType($a);
echo "1111111111111111
";
getType();
echo "222222222222222222222
";
echo "333333333333333333333
";
echo "---------------------------------------------------------
";
echo $mess;
在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中
如:error_log(“登录失败了!”);
windows系统日志查看
通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。
Apache日志: 自定义日志文件
// 默认写到了Web服务器(apache)的错误日志中
getType($a);
echo "1111111111111111
";
getType();
echo "222222222222222222222
";
error_log("数据库连接失败!");
getType3();
echo "333333333333333333333
";
class Exception{
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自定义异常代码
protected $file; // 发生异常的文件名
protected $line; // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function getCode(); // 返回异常代码
final function getFile(); // 返回发生异常的文件名
final function getLine(); // 返回发生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString(); // 可输出的字符串
}
自定义异常类必须继承自系统的异常类
/* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
class MyException extends Exception{
//重定义构造器使第一个参数 message 变为必须被指定的属性
public function __construct($message, $code=0){
//可以在这里定义一些自己的代码
//建议同时调用 parent::construct()来检查所有的变量是否已被赋值
parent::__construct($message, $code);
}
public function __toString() {
//重写父类方法,自定义字符串输出的样式
return __CLASS__.":[".$this->code."]:".$this->message."
";
}
public function customFunction() {
//为这个异常自定义一个处理方法
echo "按自定义的方法处理出现的这个类型的异常
";
}
}
?>
自定义异常
try { //使用自定义的异常类捕获一个异常,并处理异常
$error = '允许抛出这个错误';
throw new MyException($error);
//创建一个自定义的异常类对象,通过throw语句抛出
echo 'Never executed';
//从这里开始,try代码块内的代码将不会再被执行
} catch (MyException $e) { //捕获自定义的异常对象
echo '捕获异常: '.$e; //输出捕获的异常消息
$e->customFunction(); //通过自定义的异常对象中的方法处理异常
}
echo '你好呀'; //程序没有崩溃继续向下执行
简单案例
/*
1. 自定义的异常类, 必须是系统类Exception的子类
2. 如果继承Exception类, 重写了构造方法,一定要调一下父类中被覆盖的方法
3. 在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。
那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。
*/
//写出对应这个异常解决方法, 就是一下正常类的结构
class MyBtException extends Exception{
function __construct($mess) {
parent::__construct($mess);
}
function changBt() {
echo "换上备胎!";
}
}
class WcException extends Exception {
function pro() {
echo "去公厕
";
}
}
class NoException extends Exception {
function pro() {
echo "买面色凑合一下!
";
}
}
class FlException extends Exception {
function pro() {
echo "走小路!
";
}
}
class Dm {
function gowc($bj) {
if(!$bj) {
throw new WcException("马桶不好用了");
}
echo "哈哈, 事儿办的很成功!
";
}
function eat($time) {
if(!$time) {
throw new NoException("起来晚了, 早餐没了!");
}
echo "吃的很好!
";
}
function dri($dz) {
if(!$dz) {
throw new MyBtException("爆胎了");
}
echo "车开的不错!
";
}
function run($yu) {
if(!$yu) {
throw new FlException("天下雪了, 高速封路了");
}
echo "高速很好走!
";
}
}
echo "早上起床
";
try{
$dm = new Dm();
// 1. 上厕所 (马桶不好用了), 去公厕
$dm -> gowc(true);
// 2. 吃早餐 (没有早点), 买面包
$dm -> eat(true);
//3. 开车上班 (爆tai) 换下
$dm ->dri(true);
//4. 上高速 (下雪) 小路
$dm->run(false);
} catch(MyBtException $e) { // Exception $e = new Exception('');
echo $e->getMessage()."
";
//自定义类中的解决方法调用, 解决了问题
$e->changBt()."
";
try {
}catch(Exception $e) {
}
} catch(NoException $e) {
echo $e->getMessage()."
";
$e->pro();
} catch(WcException $e) {
echo $e->getMessage()."
";
$e->pro();
} catch(Exception $e) {
echo $e->getMessage()."
";
//$e->pro();
}
echo "到公司开始工作
";