PHP措辞大略的缘故原由之一便是PHP的缺点处理机制,随着PHP措辞越来越当代化,也涌现了非常,这篇博文便是大略说下缺点和非常,以便系统的理解,其余对付任何一种措辞来说,非常的存在是具备共性的,以是学习一门措辞理解非常机制是必不可少的.
什么是缺点
当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中的缺点和非常的详细内容,更多请关注其它干系文章!
更多技巧请《转发 + 关注》哦!