旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

系统化明白PHP中的毛病和非常【php教程】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP教程浏览:76


导读:PHP言语简朴的缘由之一就是PHP的毛病处置惩罚机制,跟着PHP言语愈来愈现代化,也涌现了异常,这篇博文就是简朴说下毛病和异常,以便体系的明白,别的关于任何一种言语来讲,异常的存在...
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中的毛病和异常的细致内容,更多请关注ki4网别的相干文章!

标签:PHP