PHP学习5——异常处理
主要内容:
- PHP错误类型
- 异常的产生
- 错误日志
- 日志信息记录到操作系统日志
- 异常处理
- 扩展异常处理类
PHP错误类型
- 语法错误
- 执行时错误
- 逻辑错误
异常的产生
如果安装了xampp之后,在php.ini中可以设置错误报告,配置文件路径:C:\xampp\php
可以使用error_reporting(0)关闭错误提示,使用error_reporting(E_ALL)报告所有错误
在ini文件中使用;分号注释
错误日志
使用指定文件记录错误报告日志
在开发的产品投入使用后,通常会把所有的错误提示都关闭,因为这些提示会影响消费者对产品的体验,而且曝露太多信息容易被黑客攻击。
错误信息可以保存到单独的文本(日志文件)中而不要显示在浏览器中。
默认情况都是配置好的,在程序中可以使用error_log($msg)来自定义错误信息
error.php
<?php echo "ssdsds"; error_log("这是一段自定义的报错日志信息"); ?>
打开文件
[06-Aug-2018 07:24:24 Europe/Berlin] 这是一段自定义的报错日志信息 [06-Aug-2018 07:24:50 Europe/Berlin] 这是一段自定义的报错日志信息
打开php.ini配置文件
报告PHP所有错误
设置PHP报错日志地址:
日志信息记录到操作系统日志
常用方法
- openlog($msg,$option,$facility)打开日志连接,比如openlog("php",LOG_PID,LOG_USER)
- syslog($priority,$msg)生成日志消息,比如syslog(LOG_WARNING,"向syslog中发送自定义信息。。。")
- closelog()关闭日志连接
syslog.php
<?php openlog("PHP5",LOG_PID,LOG_USER); syslog(LOG_WARNING,"向syslog发送自定义信息"); closelog(); ?>
自定的信息都被记录都爱系统日志中了,可以在计算机》管理》事件查看器》windows日志》应用程序》点击警告,即生成的信息。
异常处理
异常处理是一种可扩展、易维护的错误处理统一机制。
异常处理的实现
exception.php
<?php try{ $error="这是异常的提示信息"; throw new Exception($error); echo "这里不会被执行"; }catch(Exception $e){ echo "错误信息:".$e->getMessage()."<br/>";; } echo "程序继续向下执行"; ?>
输出
错误信息:这是异常的提示信息 程序继续向下执行
异常必须手动抛出,关键字是throw,比如 ,throw new Exception();,注意,在异常被处理后,程序会继续向下执行。
扩展异常处理类
Exception类是所有异常的基类,可以通过继承来扩展它。
Exception.php
<?php //异常类 class Exception{ protected $message='Unknow exception'; protected $code=0; protected $file; protected $line; //构造方法 public function __construct($message=null,$code=0,$previous=null){}; public function __toString();//可重载,用于返回可输出的字符串 final public function getMessage();//返回异常信息 final public function getCode();//返回异常代码 final public function getFile();//返回发生异常的文件名 final public function getLine();//返回发生异常的代码行号 final public function getTrace();//数组形式返回异常传递的线路 final public function getPrevious();//返回格式化异常 final public function getTraceAsString();//返回格式化字符串的getTrace信息 } ?>
现在我们定义自己的异常类
myException.php
<?php //异常类 class cakeException extends Exception{ public function __toString(){ return "这个蛋糕过期了<br/>"; } } //异常类 class pearException extends Exception{ public function __toString(){ return "这个梨子烂了<br/>"; } } //异常类 class appleException extends Exception{ public function __toString(){ return "这个苹果坏了<br/>"; } } try{ throw new cakeException(); }catch(Exception $e){ echo $e; } try{ throw new appleException(); }catch(Exception $e){ echo $e; } try{ throw new pearException(); }catch(Exception $e){ echo $e; } ?>
输出
这个蛋糕过期了 这个苹果坏了 这个梨子烂了
上面都是直接抛出异常,在应用中,我们通过判断来抛出异常
demo.php
<?php try{ $a=10; if(isset($b)){ echo "程序正常执行"; }else{ throw new Exception(); } }catch(Exception $e){ echo "错误代码所在路径:".$e->getFile()."<br/>"; echo "错误代码所在行号:".$e->getLine()."<br/>"; } echo "<br/>程序执行完毕<br/>"; ?>
输出
错误代码所在路径:C:\xampp\htdocs\demo.php 错误代码所在行号:8 程序执行完毕
ok,关于异常处理就到这里了。