百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 系统化了解PHP中的差错和异样
分享文章到:

系统化了解PHP中的差错和异样

发布时间:09/01 来源:未知 浏览: 关键词:
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中的错误和非常的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有157人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板