今天在例行写php代码的时候,papapa 敲完,自我感觉良好,一运行,直接报错 。 what a fuck ! 不可能! 肯定是我运行的姿势不对,对于用习惯了laravel框架的我,内心直接呐喊三连。 仔细看代码,确实有try, catch 捕获异常。 不信这个邪,搞点牛逼的代码再试试:
try {
echo 1/0;
} catch (Exception $e) {
echo $e->getMessage();
}
一试,果然还是报错啊,内心5s内久久不能冷静下来,感觉自己一直以来学的是假的php. 一直以来对异常处理挺模糊的,而今天又是个阳光明媚樱花盛开适合学习的日子(广告一波:我武大樱花挺美的),立下了flag,学习之!
说干就干,百度,这里就不得不说一篇文章,写的太特么好了,感谢作者,链接地址再谈PHP错误与异常处理,只是在人群中多看了一眼,就被吸引住了。综合的查了下 php错误有以下几种:
E_ERROR:通常会显示出来,也会中断程序执行。
E_WARNING:通常都会显示出来,但不会中断程序的执行。
E_NOTICE:在脚本正常运行下发生的代码错误。
E_PARSE:语法解析错误。
E_CORE_ERROR:在PHP启动时发生的致命错误。
E_CORE_WARNING:报告在PHP启动时发生的非致命性错误。
E_COMPILE_ERROR:编译时发生的致命错误,指出脚本的错误。
E_USER_ERROR:用户产生的错误信息。
E_USER_WARNING:用户产生的警告信息。
E_USER_NOTICE:用户引发的注意消息。
E_STRICT:编码标准化警告,运行时发生的错误。
E_RECOVERABLE_ERROR:接近致命的运行时错误,若未被捕获则视同E_ERROR。
E_ALL:捕获所有的错误和警告。
而try{} catch(){} 模块只能捕获有限的错误,一般情况下需要代码代码段抛出异常才能被捕获到,比如:
try {
throw new Exception('同志,醒醒,报错了');
} catch (Exception $e) {
echo $e->getMessage();
}
一看到这,我内心5T的草你马飞过,我他么都知道有错误了还不直接改吗?还要抛出干嘛。 上面说到的那篇文章再谈PHP错误与异常处理 又解惑了,原来php内置了 set_error_handler(),register_shutdown_function(),set_exception_handler()三个能够捕获异常的神器,三个函数怎么实现的以后再探讨,反正很牛逼。简单介绍下三个函数:
set_error_handler() : 能处理E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,E_STRICT,该函数只能捕获系统产生的一些Warning、Notice级别的错误
register_shutdown_function() : 捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用
set_exception_handler() : 设置默认的异常处理程序,用在没有用try/catch块来捕获的异常
再次感谢再谈PHP错误与异常处理 的作者! 好了,接下来就利用 这set_error_handler函数分别实现一个自定义异常类:MyErrorException,废话少说,直接上可运行的代码:
MyErrorException:
final class MyErrorException extends Exception {
protected static $instance;
protected $message;
protected $file;
protected $line;
protected $type;
public function __construct($message , $file , $line , $type ) {
$this->message = $message;
$this->file = $file;
$this->line = $line;
$this->type = $type;
}
public function message() {
return $this->message;
}
public function file() {
return $this->file;
}
public function line() {
return $this->line;
}
public function type() {
return $this->type;
}
public static function setException($type , $message , $file ,$line) {
if(empty(self::$instance))
{
self::$instance = new self($message , $file , $line , $type);
throw self::$instance;
} else {
$instance = self::$instance;
$instance->message = $message;
$instance->type = $type;
$instance->line = $line;
$instance->file = $file;
throw $instance;
}
}
}
set_error_handler(array('MyErrorException','setException'));
try {
echo 1/0;
} catch (MyErrorException $e) {
echo $e->message() . $e->line() . $e->file() . $e->type();
}