/**
* 给观察者定义规范
*
* Interface Exception_Observer
*/
interface Exception_Observer
{
public function update(Observable_Exception $e);
}
/**
* 定义观察者
* Class Observable_Exception
*/
class Observable_Exception extends Exception
{
//保存观察者信息
public static $_observers = array();
public static function attach(Exception_Observer $observer)
{
self::$_observers[] = $observer;
}
public function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
$this->notify();
}
public function notify()
{
foreach (self::$_observers as $observer) {
$observer->update($this);
}
}
}
/**
* 记录错误日志
*/
class Logging_Exception_Observer implements Exception_Observer
{
protected $_filename = __DIR__.'/error_observer.log';
public function __construct($filename = null)
{
if ($filename!==null && is_string($filename)){
$this->_filename = $filename;
}
}
public function update(Observable_Exception $e)
{
$message = "时间:".date('Y:m:d H:i:s',time()).PHP_EOL;
$message.= "信息:".$e->getMessage().PHP_EOL;
$message.= "追踪信息:".$e->getTraceAsString().PHP_EOL;
$message.= "文件:".$e->getFile().PHP_EOL;
$message.= "行号:".$e->getLine().PHP_EOL;
error_log($message,3,$this->_filename);//写到日志中
}
}
/**
* 测试
*/
header('content-type:text/html;charset=utf-8');
require_once 'Exception_Observer.php';
require_once 'Logging_Exception_Observer.php';
require_once 'Observable_Exception.php';
Observable_Exception::attach(new Logging_Exception_Observer());
class MyException extends Observable_Exception{
public function test1()
{
echo 'this is a test';
}
}
try{
throw new MyException('出现了异常!');
}catch (MyException $exception){
echo $exception->getMessage();
}
PHP配置文件中与错误相关选项
1.error_reporting 设置错误报告级别
2.display_errors 是否显示错误
3.log_errors 设置是否将错误信息记录到日志或者error_log中
4.error_log 设置脚本错误将记录到的文件
5.log_errors_max_len 设置log_errors的最大字节数
6.ignore_repeated_errors 是否忽略重复的错误信息
7.ignore_repeated_source 是否忽略重复错误消息的来源
8.track_errors 如果开启此选项,最后一个错误将永远保存在$php_errormsg中
PHP中的错误级别
1.E_ERROR 致命的运行错误,将终止程序执行
2.E_WARNING 运行时警告
3.E_PARSE 语法解析错误
4.E_NOTICE 通知注意,表示可能表现为错误的情况
5.E_CORE_ERROR 在PHP初始化启动过程中发生的警告
6.E_CORE_WARNING PHP初始化启动过程中发生的警告
7.E_COMPILE_ERROR 致命编译错误
8.E_COMPILE_WARNGING 编译时警告
9.E_USER_EORROR 用户产生的错误信息,类似E_ERROR,但是是由用户自己在代码中使用trigger_error()函数产生的。
10.U_USER_WARNING 用户产生的警告信息,类似E_WARNING,但是是由用户自己在代码中使用trigger_error()函数产生的
11.E_USER_NOTICE 用户产生的通知信息,类似E_NOTICE,但是是由用户自己在代码中使用trigger_error()函数产生的
12.E_STRICT 启动PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前的兼容性。
13.E_DEPRECATED 运行时通知,启动后将会对在未来版本中可能无法正常工作的代码给出警告。
14.E_USER_DEPRECATED 用户产生的警告信息,类似E_DEPRECATED,但是是通过trigger_error()函数产生的
15.E_ALL 所有错误和警告信息
16.E_RECOVERABLE_ERROR 可被捕获的指明错误,它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。如果该错误没有被用户自定义句柄捕获(参见set_error_handler()),将成为一个E_ERROR从而脚本会终止运行
<?php
class shutdown{
public function endScript(){
if(error_get_last()){
echo '<pre>';
print_r(error_get_last());
echo '</pre>';
}
file_put_contents('E:\www\error_log\test.txt','This is a test.');
die('end script');
}
}
//md6();
settype($arr, 'hello');
register_shutdown_function([new shutdown(),'endScript']);
?>
<?php
error_reporting(-1);
set_error_handler(function($errno,$errmsg,$file,$line){
echo "<hr /><b>错误代码:</b>[{$errno}] {$errmsg}<br />".PHP_EOL;
echo "<b>错误行号:</b>{$file}文件中的第{$line}行<br />".PHP_EOL;
echo "<b>PHP版本:</b>".PHP_VERSION."(".PHP_OS.")".PHP_EOL;
});
echo $test;
settype($arr,'aaa');
//取消接管
restore_error_handler();
?>
通过回调函数显示错误信息:
set_error_handler();
set_exception_handler();
<?php
ini_set('display_errors', 0);
error_reporting(-1);
ini_set('log_errors', 1);
ini_set('error_log','E:\www\error_log\test.log');
$date = date('Y-m-d H:i:s',time());
$message = "用户名:username,密码:123456,时间:{$date},IP地址:{$_SERVER['REMOTE_ADDR']}。";
error_log($message);
?>
PHP错误类型
1、语法错误
2、环境错误
3、逻辑错误
Deprecated 最低级别错误,不推荐使用的函数等。
Notice 通知级别错误,未声明的变量,或数组value等。
Warning 警告级别的错误,不存在的变量类型等。
Fatal 致命级别错误,不存在的函数等。
Parse 语法解析错误,缺少“;”等。
E_USER_相关的错误。
display_errors 是否显示错误
error_reporting(E_ALL~E_NOTICE) 函数设置错误
error_reporting(0);不显示所有错误,“-1”显示所有错误。
ini_set('error_reporting',0); 设置为不显示。
trigger_error()函数触发错误,手动抛出错误。
trigger_error('错误提示',E_USER_ERROE);
error_log = "E:\www\error_log\test.log" 在.ini中设置,错误日志保存路径
Error_log函数有2个功能 1将消息写入log文件error_log($message) 2发邮件
PHP配置文件中的错误相关选项;
Trigger_error用于抛出自定义错误 If(!numberic($num1)){ Trigger_error("必须是合法数字",E_USER_NOTICE)
请输入笔记内容.error_reporting():专业php错误处理设置函数
error_reporting(0);不显示所有错误,但是解析parse语法错误会显示;
Error_reporting(E_ALL|~E_WARING)除了警告错误以外的错误级别都报告
显示错误
ini_set(Option,value):可以配置php.ini里的选项,当然包括错误处理部分的选项了
设置错误级别..
ini_set('error_reporting',0)=>不显示所有错误;
ini_set('error_reporting',-1)=>显示所有错误;
php配置文件php.ini设置error_reporting;
通过error_reporting()函数设置
display_errors指定程序运行时现不显示错误
error_reporting指定错误级别
PHP中所有的错误级别
php配置文件中与错误相关选项
php中年的错误级别(致命错误)
php中的错误级别
笔记:自定义异常处理器
笔记:自定义异常类
笔记:PHP中的异常简介及使用
/** * 方式二:自定义异常类 * Class ErrorToException */ //显示所有的错误 error_reporting(-1); class ErrorToException extends Exception{ public static function handle($errno,$errstr) { throw new self($errstr,0); } } set_error_handler(array('ErrorToException','handle')); set_error_handler(array('ErrorToException','handle'),E_USER_WARNING|E_WARNING); try{ echo $test;//notice,不会被处理 echo gettype();//warning //手动触发错误 trigger_error('test',E_USER_WARNING); }catch (Exception $exception){ echo $exception->getMessage(); }
/** * 方式一:ErrorException错误异常类 * @param $errno * @param $errstr * @param $errfile * @param $errline * @throws ErrorException */ function exception_error_handler($errno,$errstr,$errfile,$errline){ throw new ErrorException($errstr,0,$errno,$errfile,$errline); } set_error_handler('exception_error_handler'); try{ echo gettype(); }catch (Exception $exception){ echo $exception->getMessage(); }
/** * 自定义异常类处理器 * Class ExceptionHandler */ class ExceptionHandler { protected $_exception; protected $_logFile = __DIR__.'/exception_handle.log'; public function __construct(Exception $e) { $this->_exception = $e; } public static function handle(Exception $e) { $self = new self($e); $self->log(); echo $self; } public function log() { error_log($this->_exception->getMessage().PHP_EOL,3,$this->_logFile); } /** * 魔术方法__toString() * 快速获取对象的字符串信息的便捷方式,直接输出对象引用时自动调用的方法。 * @return string */ public function __toString() { $message = <<<EOF <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>出现异常了啊啊啊啊</h1> </body> </html> EOF; return $message; } } set_exception_handler(array('ExceptionHandler','handle')); /** * try catch不会被自定义异常处理!!!! */ try{ throw new Exception('this is a test'); }catch (Exception $exception) { echo $exception->getMessage(); } throw new Exception('测试自定义的异常处理器');
/** * 自定义异常函数处理器 */ header('content-type:text/html;charset=utf-8'); function exceptionHandler_1($e) { echo '自定义异常处理器1<br/>函数名:'.__FUNCTION__.PHP_EOL; echo '异常信息:'.$e->getMessage(); } function exceptionHandler_2($e) { echo '自定义异常处理器2<br/>函数名:'.__FUNCTION__.PHP_EOL; echo '异常信息:'.$e->getMessage(); } set_exception_handler('exceptionHandler_1'); //set_exception_handler('exceptionHandler_2'); //恢复到上一次定义过的异常处理函数,即exceptionHandler_1 //restore_exception_handler(); //致命错误信息 //restore_exception_handler(); throw new Exception('测试自定义异常处理器'); //自定义异常处理器,不会向下继续执行;异常被捕获之后,会继续执行 //回顾:自定义错误处理器会继续执行代码,而手动抛出的错误信息不会继续执行 echo 'test';
header('content-type:text/html;charset=utf-8'); require_once 'Exception_Observer.php'; require_once 'Logging_Exception_Observer.php'; require_once 'Observable_Exception.php'; Observable_Exception::attach(new Logging_Exception_Observer()); //Observable_Exception::attach(new Logging_Exception_Observer('test.log')); class MyException extends Observable_Exception{ public function test1() { echo 'this is a test'; } } try{ throw new MyException('出现了异常!'); }catch (MyException $exception){ echo $exception->getMessage(); }
/** * 给观察者定义规范 * * Interface Exception_Observer */ interface Exception_Observer { public function update(Observable_Exception $e); } /** * 定义观察者 * Class Observable_Exception */ class Observable_Exception extends Exception { //保存观察者信息 public static $_observers = array(); public static function attach(Exception_Observer $observer) { self::$_observers[] = $observer; } public function __construct($message = "", $code = 0, Throwable $previous = null) { parent::__construct($message, $code, $previous); $this->notify(); } public function notify() { foreach (self::$_observers as $observer) { $observer->update($this); } } } /** * 记录错误日志 */ class Logging_Exception_Observer implements Exception_Observer { protected $_filename = __DIR__.'/error_observer.log'; public function __construct($filename = null) { if ($filename!==null && is_string($filename)){ $this->_filename = $filename; } } public function update(Observable_Exception $e) { $message = "时间:".date('Y:m:d H:i:s',time()).PHP_EOL; $message.= "信息:".$e->getMessage().PHP_EOL; $message.= "追踪信息:".$e->getTraceAsString().PHP_EOL; $message.= "文件:".$e->getFile().PHP_EOL; $message.= "行号:".$e->getLine().PHP_EOL; error_log($message,3,$this->_filename);//写到日志中 } } /** * 测试 */ header('content-type:text/html;charset=utf-8'); require_once 'Exception_Observer.php'; require_once 'Logging_Exception_Observer.php'; require_once 'Observable_Exception.php'; Observable_Exception::attach(new Logging_Exception_Observer()); class MyException extends Observable_Exception{ public function test1() { echo 'this is a test'; } } try{ throw new MyException('出现了异常!'); }catch (MyException $exception){ echo $exception->getMessage(); }
try { // 需要进行异常处理的代码段; throw 语句抛出异常; }catch( Exception $e ) { ... } catch( Exception $e ) { // 处理异常 } contine..... //未被捕获 Fatal error:Uncaught exception.....
什么时异常?异常和错误有什么区别?
异常:程序运行与预期不太一致,与错误是两个不同的概念
1. 什么时异常?异常和错误有什么区别?
2. 异常的基本语法结构
3. 如何自定义异常类
4. 如何自定义异常处理器
5. 如何像处理异常一样处理PHP的错误
6. 在发生错误的时候将用户重定向到另一个页面
笔记链接:处理PHP中的错误