zoukankan      html  css  js  c++  java
  • PHP中的错误处理

    错误很常见,比如Notice,Warning等等。此时一般使用set_error_handler来处理:

    <?php
    
    set_error_handler(function($errno, $errstr, $errfile, $errline) {
        var_dump($errno, $errstr, $errfile, $errline);
    });
    
    // Notice: Use of undefined constant strlen
    strlen;
    
    // Warning: strlen() expects exactly 1 parameter, 0 given
    strlen();
    
    ?>
    

    具体能做些什么呢?统一管理错误日志,或者呈现一个相对友好的错误提示页面等等。

    但需要注意的是set_error_handler无法捕捉某些Fatal error,比如下面这个错误:

    <?php
    
    set_error_handler(function($errno, $errstr, $errfile, $errline) {
        var_dump($errno, $errstr, $errfile, $errline);
    });
    
    // Fatal error: Call to undefined function undefined_function()
    undefined_function();
    
    ?>
    

    不过我们真的就一点办法都没有了么?当然不是,我们不仅有办法,而且还有好几种:

    第一种:ob_start + error_get_last

    <?php
    
    ob_start(function($buffer) {
        if ($error = error_get_last()) {
            return var_export($error, true);
        }
    
        return $buffer;
    });
    
    // Fatal error: Call to undefined function undefined_function()
    undefined_function();
    
    ?>
    

    第二种:register_shutdown_function + error_get_last

    <?php
    
    register_shutdown_function(function() {
        if ($error = error_get_last()) {
            var_dump($error);
        }
    });
    
    // Fatal error: Call to undefined function undefined_function()
    undefined_function();
    
    ?>
    

    此外,所有的Parse error(比如说少写了分号之类的错误)都无法捕捉,不过换个角度看,解析错误的代码本身就不应该发布,甚至都不应该进入版本库,关于这一点,我以前写过一篇《Subversion钩子》,里面介绍了如何利用Subversion钩子做代码语法检查。

    转载自 http://huoding.com/2012/05/31/151

  • 相关阅读:
    几种负载均衡技术的实现
    gevent和tornado异步
    Android笔记:invalidate()和postInvalidate() 的区别及使用——刷新ui
    ubuntu终端颜色配置
    应用程序基础及组件(续)
    安卓架构
    Linux下安卓ndk混合编译调用so方法——QuickStart学习
    JAVA反射机制
    BroadcastReceiver应用详解——广播
    库会因为权限问题无法打开——selinux开启严格模式
  • 原文地址:https://www.cnblogs.com/dai330713/p/4016047.html
Copyright © 2011-2022 走看看