什么是毛病
当PHP言语碰到异常的状况(比方数据库衔接不上或许函数参数通报毛病),则会报出一些毛病,毛病能够分为多种范例,除了E_ERROR和E_CORE_ERROR毛病,别的毛病不会停止顺序运转.
PHP让人以为简朴的缘由就在于顺序不会频仍的报错,给人一种编写流通和轻易的错觉.
也正因为这个缘由PHP顺序的严谨性和准确性差了不少,比方mysql_fetch_array查询碰到收集毛病返回FALSE的时刻(顺序没有停止运转),如果挪用顺序以为查询没有婚配的数据,则这个顺序实质是毛病的.
经由过程 php.ini的指令 error_reporting或许动态挪用 error_reporting()函数我们能够挑选报告什么范例的毛病,经由过程 display_errors指令则能够掌握毛病是不是在线输出.而 error_log指令能够掌握将毛病输出到日记中.
怎样准确运用毛病
不管是体系函数或许是自定义函数,如果内部碰到毛病,怎样告之挪用者呢?平常是经由过程函数返回 TRUE或许 FALSE来表明.这类处置惩罚体式格局有几个弊病:
● 挪用者只知道发生了毛病,然则返回的毛病信息太少,且缺少毛病范例的申明
● 顺序处置惩罚逻辑和毛病处置惩罚混淆在一块,发生的代码会异常的不清楚.
一个小技能: error_get_last()函数会返回近来毛病发生的细致缘由.
最好实践:
● set_error_handler()函数来托管一切的毛病
● trigger_error()函数能够触发自定义毛病,能够用来在函数中替代 return 语句
● 将一切的毛病输出到日记中,同时定义毛病范例
● 对用户显现毛病,比方将毛病以一种更友爱的体式格局返回给用户
● 生产环境下 display_errors指令要封闭,开辟环境则该指令翻开
老牌的PHP框架 Codeigniter处置惩罚毛病的体式格局能够自创
function _error_handler($severity, $message, $filepath, $line) { $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); //输出500毛病HTTP状况码 if ($is_error) { set_status_header(500); } //关于不须要处置惩罚的毛病则直接中断 if (($severity & error_reporting()) !== $severity) { return; } //将一切的毛病记录到日记中 $_error =& load_class('Exceptions', 'core'); $_error->log_exception($severity, $message, $filepath, $line); //友爱的输出一切毛病 if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){ $_error->show_php_error($severity, $message, $filepath, $line); } //如果致命毛病则直接退出 if ($is_error) { exit(1); } } set_error_handler('_error_handler');
什么是异常
异常也是一个毛病,它具有以下的特性:
● 异常能够自定义,SPL供应了许多范例的异常,你也能够扩大它
● 异常最通例的行动就是捕捉,如许开辟者就可以依据细致的毛病举行后续处置惩罚.比方能够依据异常的上下文给用户返回友爱的提醒.或许继续抛出一个异常,让上游的顺序去处置惩罚.如果照样没有捕捉异常,那末顺序就直接停止了.
● 异常别的个行动就是抛出,如果经由过程函数编写营业逻辑,碰到不测的状况,能够直接扔出一个异常.
● 异常能够被代码一层一层捕捉,如果最外层的顺序还没有捕捉,则代码直接停止运转
● PHP中的异常如果不能捕捉,则作为致命毛病写入到体系毛病日记中
经由过程直观的代码来讲明下:
function inverse($x) { if ($x < 10) { throw new Exception('x<10'); } elseif ($x >= 10 and $x < 100) { throw new LogicException('x>=10 and x<100'); } return $x; } try { echo inverse(2)."\n"; } catch (LogicException $e) { echo 'Caught LogicException: ', $e->getMessage(), "\n"; } catch (Exception $e) { echo 'Caught Exception: ', $e->getMessage(), "\n"; throw $e; }
异常的最好实践
● 异常能够让代码越发清楚,让开辟者专注于营业逻辑的编写.
● 构建可扩大的异常是异常有技术性的,岂非SPL异常还做的不够吗?
● 捕捉异常应当仅仅捕捉本层能处置惩罚的异常,关于不能处置惩罚的异常则让上游的代码处置惩罚.
PHP7中的异常
PHP7勉励运用异常来替代毛病,然则不可能一会儿颠覆毛病处置惩罚机制,须要兼容,所以只能逐步过渡.
然则能够经由过程变通的体式格局来一致运用异常
● Error异常
PHP中定义了一个 Error异常,注重这个异常和 Exception是并列的,
当翻开严厉形式的时刻,PHP7中许多的毛病是被 Error异常抛出的.如许就可以一致运用异常了.
declare (strict_types = 1); function add(int $a, int $b) { return $a + $b; } try { echo add("3", "4"); } catch (TypeError $e) { //TypeError继续自Error echo $e->getMessage(); }
● ErrorException
ErrorException继续自 Exception.
我们能够经由过程 set_error_handler()函数将一切的毛病转换成 ErrorException.如许就可以兴奋的一致运用异常了.
以上就是体系化明白PHP中的毛病和异常的细致内容,更多请关注ki4网别的相干文章!