php运行报错时继续运行,php的异常和处理

常见错误处理类型

语法错误

环境错误

逻辑错误

常见错误级别

Deprecated 最低级别的错误

不推荐,不建议,使用一些过期函数的时候会出现,程序继续执行

Notice 通知级别的错误

使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行

Waning 警告级别的错误

程序出问题了,需要修改代码!!!程序继续执行

Fatal Error 错误级别的错误

程序直接报错,需要修改代码!!!中断程序执行

parse error 语法解析错误

语法检查阶段报错,需要修改代码!!!中断程序执行

E_USER_相关的错误

用户定义的错误,用户手动抛出错误,进行自定义错误处理

PHP配置文件和错误相关选项

设置错误级别

1、通过修改php.ini文件设置错误级别,静态设置,需要重启apache

// error_reporting = E_ALL&~E_NOTICE; //显示所有错误,除了E_NOTICE级别

// display_errors = 1; //线下开启,先上关闭

2、通过error_reporting()函数设置,动态设置

// error_reporting(E_ALL&~E_NOTICE); //显示所有错误,除了E_NOTICE级别

// error_reporting(0); //屏蔽所有错误,只会显示语法解析错误

// erorr_reporting(-1); //显示所有错误

3、通过ini_set()函数进行运行时设置,动态设置

// ini_set('error_reporting',0);

// ini_set('error_reporting',-1);

// ini_set('display_errors',0);

使用triggerr_error进行错误抛出

header('content-type:text/html;charset=utf-8');

$num1=1;

$num2='xxx';

if ( (!is_numeric($num1) || !is_numeric($num2)) ) {

//通知级别,代码继续执行

//echo trigger_error('数值必须为整型!',E_USER_NOTICE);

//警告级别,代码继续执行

//echo trigger_error('数值必须为整型!',E_USER_WARNING);

//错误级别,代码中断

echo trigger_error('数值必须为整型!',E_USER_ERROR);

}else{

echo $num1+$num2;

}

echo '
代码继续执行';

记录错误

配置php.ini脚本设置记录错误

log_errors = On //是否将产生错误信息记录到日志或者error_log中

;error_log = syslog //设置脚本错误将记录到系统日志中

log_errors_max_len = 1024 //设置错误报错最大值,单位字节

ignore_repeated_errors = Off //是否忽略重复的错误信息

ignore_repeated_source = Off //是否忽略重复错误消息的来源

track_errors = On //如果开启,最后一个错误将永远保存在$php_errormsg中

将错误记录到指定的文件中

//运行时设置错误处理

ini_set('display_errors','off');

ini_set('error_log','D:\logs\error.log');

//设置错误输出

error_reporting(-1);

echo $test; //NOTICE

echo '


';

settype($var,'king'); //Warning

echo '


';

test(); //Fatal error

将日志文件保存到系统日志中

error_reporting(-1);

ini_set('display_errors',0);

ini_set('log_errors',1);

ini_set('error_log','syslog');

//该记录方式,在windows中需要去,计算机管理-》事件查看器-》自定义视图中查找php5.4.0的log日志

openlog('PHP5.4.0',LOG_PID,LOG_SYSLOG);

syslog(LOG_ERR,'this is syslog !!!daye:'.date('Y/m/d H:i:s'));

closelog();

将错误以邮件形式发送

1、首先需要配置邮件服务器!

2、去php.ini中配置邮件参数

3、写代码

error_log('当前系统被人攻击!产生错误!',1,'87399497@qq.com');

error_log函数使用

error_log($msg); //传入错误记录,需要与error_log配置使用

如何使用Set_error_handler()

header('content-type:text/html;charset=utf-8');

//-1代表显示所有的错误警告

error_reporting(-1);

/**

* 自定义一个错误处理

* @param [type] $errno [错误级别]

* @param [type] $errmsg [错误信息]

* @param [type] $file [错误文件]

* @param [type] $line [错误行号]

* @return [type] [description]

*/

function customer_error($errno,$errmsg,$file,$line){

echo "错误代码:[{$errno}] {$errmsg}
".PHP_EOL;

echo "错误行号:{$file}文件中的第 {$line}
".PHP_EOL;

echo "PHP版本:".PHP_VERSION."(".PHP_OS.")
".PHP_EOL;

//注意:如果自定义错误处理捕获了,代码还是会执行,如果不想被执行,需要die掉!!!

//die;

}

//设置自定义错误处理

set_error_handler('customer_error');

//输出一个未定义变量的警告

echo $test;

echo '


';

//原生出错

//Notice: Undefined variable: test in D:\phpStudy\WWW\example\index.php on line 26

//自定义出错

//错误代码:[8] Undefined variable: test

//错误行号:D:\phpStudy\WWW\example\index.php文件中的第 26

//PHP版本:5.3.29(WINNT)

//无法捕获一个致命错误Fatal error,会切换到原生出错

//test();

//手动抛出一个错误,被自定义的错误处理捕获

trigger_error('this is a test of error',E_USER_ERROR);

echo 'contiune';

echo '


';

//错误代码:[256] this is a test of error

//错误行号:D:\phpStudy\WWW\example\index.php文件中的第 43

//PHP版本:5.3.29(WINNT)

//contiune

//取消自定义错误处理,将会重新适应PHP原生的错误处理

restore_error_handler();

echo $tt;

echo '


';

//Notice: Undefined variable: tt in D:\phpStudy\WWW\example\index.php on line 49

//重新挂载自定义错误处理

//除了NOTICE级别的交给系统处理,剩下的全部使用customer_error自定义的错误处理

set_error_handler('customer_error',E_ALL&~E_NOTICE);

echo $asc; //E_NOTICE级别,系统的错误处理

settype($var,'king'); //E_WARNING级别,使用自定义的错误处理

//Notice: Undefined variable: asc in D:\phpStudy\WWW\example\index.php on line 65

//错误代码:[2] settype() [function.settype]: Invalid type

//错误行号:D:\phpStudy\WWW\example\index.php文件中的第 66

//PHP版本:5.3.29(WINNT)

自定义一个错误处理器

class MyErrorHandler{

public $msg='';

public $filename='';

public $line=0;

public $vars=array();

public function __construct($msg,$filename,$line,$vars){

$this->msg = $msg;

$this->filename = $filename;

$this->line = $line;

$this->vars = $vars;

}

public static function deal($errno,$errmsg,$filename,$line,$vars){

$self = new self($errmsg,$filename,$line,$vars);

switch ($errno) {

case E_USER_ERROR :

return $self->dealError();

break;

case E_USER_WARNING :

case E_WARNING :

return $self->dealWarning();

break;

case E_NOTICE :

case E_USER_NOTICE :

return $self->dealNotice();

break;

default:

return false;

break;

}

}

/**

* 处理致命错误

* @return [type] [description]

*/

public function dealError(){

ob_start();

debug_print_backtrace();

$backtrace = ob_get_flush();

$errmsg = <<

出现了致命错误,如下:

产生错误的文件:{$this->filename}

产生错误的信息:{$this->msg}

产生错误的行号:{$this->line}

追踪信息:{$backtrace}

EOF;

//发送邮件的错误日志

//error_log($errmsg,1,'87399497@qq.com');

//记录到错误日志

error_log($errmsg,3,'D:/logs/customer_error.log');

exit(1);

}

/**

* 处理警告错误

* @return [type] [description]

*/

public function dealWarning(){

$errmsg = <<

出现了警告错误,如下:

产生警告的文件:{$this->filename}

产生警告的信息:{$this->msg}

产生警告的行号:{$this->line}

EOF;

error_log($errmsg,3,'D:/logs/customer_warning.log');

}

/**

* 处理通知级别的错误

* @return [type] [description]

*/

public function dealNotice(){

$date = date('Y-m-d H:i:s',time());

$errmsg = <<

出现了通知错误,如下:

产生错误的文件:{$this->filename}

产生错误的信息:{$this->msg}

产生错误的行号:{$this->line}

产生通知的时间:{$date}

EOF;

error_log($errmsg,3,'D:/logs/customer_notice.log');

}

}

//显示所有错误

error_reporting(-1);

//设置自定义错误,使用传入类和方法的方式

set_error_handler(array('MyErrorHandler','deal'));

//触发NOTICE级别错误,会保存到log日志中

echo $tt;

//手动触发一个错误

trigger_error('手动抛出一个错误',E_USER_ERROR);

register_shutdown_function()函数

//register_shutdown_function该函数将会在PHP执行关闭时调用

//使用场景

//1、页面强制停止

//2、代码意外终止

class Showdown{

public static function endScript(){

if (error_get_last()){

echo '

';

error_get_last();

echo '';

//因为register_shutdown_function调用该函数的时候,是代码终止,脱离当前PHP上下文环境了

//所以$filename的路径要写决定路径!!!

file_put_contents('D:\logs\register_shutdown_function.log', error_get_last());

die('endScript');

}

}

}

//特别声明!如果有die或exit在注册错误处理之前,那么将不会注册错误处理

register_shutdown_function(array('Showdown','endScript'));

echo md6();

错误抑制符

@settype($var,'longjq'); //无变量$var,使用@符号进行抑制错误输出

错误级别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值