系统化理解PHP中的错误和异常-php教程

资源魔 21 0
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中的谬误以及异样的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!