目录结构:php
在这篇文章中,笔者将会阐述PHP中的异常处理,但愿可以对你有所帮助。html
PHP5中定义了16种不一样的错误级别,下面仅仅粘贴其中几种。程序员
级别常量 | 错误值 | 错误报告描述 |
E_ERROR | 1 | 致命的运行时错误(阻止脚本执行) |
E_WARNING | 2 | 运行时警告(非致命性错误) |
E_PARSE | 4 | 从语法中解析错误 |
E_NOTICE | 8 | 运行时注意消息(多是或可能不是一个问题) |
E_CORE_ERROR | 16 | PHP启动时初始化过程当中的致命错误 |
E_CORE_WARNING | 32 | PHP启动时初始化过程当中的警告(非致命性错) |
E_COMPILE_ERROR | 64 | 编译时致命性错 |
E_COMPILE_WARNING | 128 | 编译时警告(非致命性错) |
E_USER_ERROR | 256 | 用户自定义的致命错误 |
E_USER_WARNING | 512 | 用户自定义的警告(非致命性错误) |
E_USER_NOTICE | 1024 | 用户自定义的提醒 |
E_STRICT | 2048 | 编码标准化警告(建议如何修改以向前兼容) |
E_ALL | 32767 | 全部的错误、警告和注意信息,在PHP5.4.0以前的版本以前不包含E_STRICT错误级别。函数 注意:在PHP 5.4.x 中是32767,在PHP 5.3.x中是30719,在 PHP 5.2.x中是6143,在5.2.x以前的版本是2047。this |
在知道了这些错误级别后,咱们开始调整错误报告级别,既能够经过修改PHP配置文件,也能够经过修改PHP脚本代码来实现。编码
先介绍如何经过修改PHP配置文件来实现,在PHP的配置文件(php.ini)中,display_errors直接控制PHP是否输出错误、提醒和警告信息。它的值有On、Off、stdout、stderr:
On 或 stdout:表示输出全部消息到标准的输出流。
stderr:表示输出全部消息到标准的错误流。
Off:表示不显示任何消息。
还能够经过PHP脚本代码来修改php.ini配置文件,经过ini_set(...)函数能够实现这个功能,
好比修改php.ini配置文件中的display_errors属性的话,能够经过:spa
ini_set("display_errors","On");
这里是将全部的消息都输出到标准输出流。
例如:操作系统
<html> <head> <title>display_errors</title> </head> <body> <?php //ini_set("display_errors","Off"); echo "-------------------------------------<br/>"; gettype();//抛出警告信息 echo "-------------------------------------<br/>"; ?> </body> </html>
效果图:
给ini_set("display_errors","Off");取消注释后,会看到以下效果:
经过手动修改PHP配置文件和ini_set函数,均可以达到这个功能,然而手动修改PHP配置文件的项目可移植性不强,推荐经过ini_set函数来实现。
display_errors至关于总开关,要么开启全部错误消息输出,要么关闭全部的错误消息输出。那么有没有可以控制报告不一样级别的错误设置呢?PHP提供的error_reporting()函数就能够动态完成设置错误报告级别。如:error_reporting(E_ALL);
例如:rest
<html> <head> <title>display_errors</title> </head> <body> <?php error_reporting(E_ALL);//报告全部错误 echo "-------------------------------------<br/>"; gettype(); echo "-------------------------------------<br/>"; ?> </body> </html>
效果与ini_set("display_errors","On");同样。
error_reporting()能够设置16中错误级别中的任何一种,强烈建议在设置的时候经过常量名来设置,在将来的版本中才能保证移植性。
error_reporting()也能够接受位标志,例如:日志
error_reporting(E_ERROR | E_WARNING);
经过上面的案例咱们能够看到,全部抛出的错误都是在错误代码处抛出的,这是标准的PHP错误处理函数。
然而PHP容许程序员自定义错误和异常处理器,可以彻底绕过PHP标准的错误和异常处理函数,这样的话,就能够自定义错误和异常的处理方式。
mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )
自定义的错误处理器,当有错误发生时,会调用该处理器设置的异常。
callable set_exception_handler ( callable $exception_handler )
自定义的异常处理器,当有未捕获的异常抛出时候,该函数设置的处理器就会处理该异常。
restore_exception_handler()
当使用set_exception_handler设置过自定义异常处理器后,restore_exception_handler能够恢复到以前的那个异常处理器。
restore_error_handler()
当使用set_error_handler设置过自定义错误处理器后,restore_error_handler能够恢复到以前的那个错误处理器。
若是要设置异常日志的话,那么就要修改PHP配置文件php.ini。
error_reporting = E_ALL//将向PHP发送每一个错误
display_errors=Off //不显示错误报告
log_errors=On //开启日志记录
log_errors_max_log=1024// 每一个日志项的最大长度
error_log="c:/myerror.log" //指定错误写进的文件
在php文件中使用error_log()来记录日志,就能够将信息写入到myerror.log文件中。
好比:
error_log("unexpected error");
error_log不只能够指定日志的记录文件,还能够将日志输出到操做系统中,只要将error_log指定为syslog就能够了(Win 95不支持)。
一个自定义的异常类必须从Exception派生,Exception类的元数据以下:
Exception implements Throwable { /* Properties */ protected string $message ; protected int $code ; protected string $file ; protected int $line ; /* Methods */ public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] ) final public string getMessage ( void ) final public Throwable getPrevious ( void ) final public mixed getCode ( void ) final public string getFile ( void ) final public int getLine ( void ) final public array getTrace ( void ) final public string getTraceAsString ( void ) public string __toString ( void ) final private void __clone ( void ) }
其中__construct表示构造方法,能够按照须要重写它的构造方法和__toString()方法。
例如:
<?php /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */ class MyCustomException extends Exception{ //重定义构造器使第一个参数 message 变为必须被指定的属性 public function __construct($message, $code=0){ //能够在这里定义一些本身的代码 //建议同时调用 parent::construct()来检查全部的变量是否已被赋值 parent::__construct($message, $code); } public function __toString() { //重写父类方法,自定义字符串输出的样式 return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } public function customFunction() { //为这个异常自定义一个处理方法 echo "按自定义的方法处理出现的这个类型的异常<br>"; } } try{ throw new MyCustomException("Unexpected Exception"); }catch(MyCustomException $e){ echo $e; $e->customFunction(); } echo "<br/>"; echo "end"; ?>