在php.ini里吧display_errors=On开启
语法错误,比如没有加分号
echo 1;
echo 2
连1都没有出来,这就是语法错误,语法分析当中,会把类啊,函数啊加到内存当中
echo 1;
require 'houdunren';
运行时错误,会执行1,但是require会报错
逻辑错误,如果写成了--,那么会造成死循环,属于业务逻辑错误,需要程序员自己解决
for($i = 0 ;$i <5; $i++){
echo $i;
}
代码上线后需要把错误都关闭掉,在开发期理应开启所有的错误通知
错误级别
关闭警告与致命错误,例如require(a)
error_reporting(~E_WARNING &~E_COMPILE_ERROR);
require('a');
显示除通知外的所有错误,通知错误,变量没有定义
error_reporting(E_ALL & ~E_NOTICE);
echo $test;
关闭错误提示,所有错误都不显示,在生产环境下的时候,用户看不见,把发生的错误存到日志中,从日志中找这些错误,解决问题,在下一次版本升级的时候修复
error_reporting(0);
忽略错误
require a;
echo "test";
这个会报错,但是
@require a;
echo "test";
就会把错误忽略掉
记录到错误日志里,在下一次的版本迭代中,把错误修正
php.ini也可以改
error_reporint = E_ALL
用函数当然更灵活了,主要推荐的方式
自定义错误处理引擎
namespace Core;
class Error{
protected $debug;
public function __constructor(){
$this->debug = $debug;
}
public function error(){
error_reporting(0);
set_error_handler([$this,'handle'],E_ALL | E_STRICT);//所有错误都要交给错误处理函数处理
}
//发生错误时都会经过该函数
public function handle($code,$error,$file,$line){
echo $file;
$msg = $error."($code)" . $file . "($line)";
switch($code){
case E_NOTICE:
echo $msg;
include 'views/notice.php'
break;
default:
include 'views/error.php';
die;//处理完就停止
break;
}
}
}
<?php
include 'Error.php';
(new Error())->error();
echo $a;
PHP可以定义不同级别的错误处理等级
也可以放到模板中
发生多条通知性错误的时候,就会显示多条
require a;//警告性错误
使用debug来处理错误
if($this->debug){
echo $msg;
include 'views/notice.php'
}
if($this->debug){
echo $msg;
include 'views/error.php'
}
(new Error(false))->error();//错误就不显示,引入了$debug错误是否显示变量
日志检测错误
使用日志保存错误
logs,在logs文件夹下
default:
if($this->debug){
include 'view/error.php'
}else{
$file = 'logs/'.date("Y_m_d").'.log';
error_log(date('[c]').$msg.PHP_EOL,3,$file);
}