PHP 开发经典教程:程序缺陷排除(2)_PHP应用_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

PHP 开发经典教程:程序缺陷排除(2)

作者:黑客防线网安PHP维护基地 来源:黑客防线网安PHP维护基地 浏览次数:0

本篇关键词:缺陷排除程序教程
黑客防线网安网讯:     如果你运行这个脚本,那么你将会得到一个非致命的错误(E_WARNING),该错误意味着如果在对explode()调用的后面还有语句,那么这些语句会得到执行。你亲自试试然后看看!为了产生一个致命...

     如果你运行这个脚本那么你将会得到一个非致命的错误(E_WARNING)该错误意味着如果在对explode()调用的后面还有语句,那么这些语句会得到执行你亲自试试然后看看!

为了产生一个致命的错误,你需要投入一些更多的工作请看下面:


  

undefined
undefined
   <?
    php

    //
     call a non-existent function

    //
     this will generate a fatal error (E_ERROR)
   

    callMeJoe();

    ?>
    

这里,对不存在的函数的调用绊到了PHP的警报线然后产生了一个致命错误,该错误立即停止了脚本的执行。

现在,更有趣一点了吧。你可以通过使用内建的PHP函数error_reporting()来控制向用户显示哪条错误消息。该函数接受一个指定的常量然后告诉脚本只报告与该类型匹配的错误。为了看看这方面的实际操作,考虑下面的为“隐藏”非致命错误而对之前脚本之一的改写:


  

undefined
undefined
   <?
    php

    //
     report only fatal errors
   

    error_reporting(E_ERROR);

    //
     initialize the $string variable
   

    $
    string
    
    =
    
    '
    string
    '
    ;

    //
     attempt to explode() a string

    //
     this will not generate a warning because only fatal errors are reported
   

    explode($
    string
    );

    ?>
    

在该例子中,当脚本执行时,即使对函数explode()的调用所包含的参数比它应该需要的参数少了一个,但也没有告警产生。
你也可以使用类似的技术来关闭致命错误的显示:


  

undefined
undefined
   <?
    php

    //
     report no fatal errors
   

    error_reporting(
    ~
    E_ERROR);

    //
     call a non-existent function
   

    callMeJoe();

    ?>
    

然而,请记住,错误不被报告并不意味着它没有发生。即使上述脚本不会显示一个可见的错误消息,但脚本执行将会在错误点处停止而且该点随后的语句将不被执行。error_reporting()函数给了你显示哪个错误的控制权;但它不能阻止错误本身的发生。

请注意,在php.ini内具有进一步的设置以用于生产一线。你可以(且应该)关闭display_errors、指定error_log文件和打开log_errors。

也请注意,上面所使用的隐藏错误消息的方法,虽然极其简单,但不被推荐做一般性的使用。不管错误类型,捕获所有的错误而且忽略它们是一种拙劣的编程习惯;提前预测可能的错误然后编写监视这些错误的防御性代码然后适当的处理这些错误要比上述方法好的多(而且更专业)。这会防止你的用户在错误发生时发现他们自己看到的是一个莫名其妙的空白页面。

构造你自己的错误处理器

请记住这个,让我们来讨论一些关于改变错误被处理的方式。考虑一个典型的PHP错误消息:它列出了错误类型、一条描述性消息和产生错误的脚本的名字。大部分情况下,这是非常足够的,但如果你的老板是一个要求苛刻的客户而且要求必须有一种“更好的方法”时该怎么办呢?

嗯,这里有一种方法。它就是一个被称为set_error_handler()的小函数而且它允许你将所有的PHP错误转移给一个你已经定义的自定义函数而不是将其发送到默认的处理器。该自定义函数必须能够最少接受两个强制性参数(错误类型及其对应的描述性消息)一直到三个另外的参数(错误发生地的文件名称和行号以及错误发生时的变量空间转储)。

下列例子或许可以使这点更清楚些:


  

undefined
undefined
   <?
    php

    //
     define a custom error handler
   

    set_error_handler(
    '
    oops
    '
    );

    //
     initialize the $string variable
   

    $
    string
    
    =
    
    '
    a string
    '
    ;

    //
     explode() a string

    //
     this will generate a warning because the number of arguments to explode() is incorrect

    //
     the error will be caught by the custom error handler
   

    explode($
    string
    );

    //
     custom error handler
   

    function oops($type, $msg, $file, $line, $context) {
echo
    "
    <h1>Error!</h1>
    "
    ;
echo
    "
    An error occurred while executing this script. Please contact the <a href=mailto:webmaster@somedomain.com>webmaster</a> to report this error.
    "
    ;
echo
    "
    <p />
    "
    ;
echo
    "
    Here is the information provided by the script:
    "
    ;
echo
    "
    <hr><pre>
    "
    ;
echo
    "
    Error code: $type<br />
    "
    ;
echo
    "
    Error message: $msg<br />
    "
    ;
echo
    "
    Script name and line number of error: $file:$line<br />
    "
    ;
$variable_state
    =
     array_pop($context);
echo
    "
    Variable state when error occurred:
    "
    ;
print_r($variable_state);
echo
    "
    </pre><hr>
    "
    ;
}

    ?>

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14003-1.html
网站维护教程更新时间:2012-03-30 05:07:14  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer