Home  >  Article  >  Backend Development  >  自定义错误ThinkThink::appError 设计有问题!!

自定义错误ThinkThink::appError 设计有问题!!

WBOY
WBOYOriginal
2016-06-06 20:35:231368browse

http://us.php.net/manual/zh/function.set-error-handler.php

以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

<code>   /**
     * 自定义错误处理
     * access public
     * @param int $errno 错误类型
     * @param string $errstr 错误信息
     * @param string $errfile 错误文件
     * @param int $errline 错误行数
     * return void
     */
    static public function appError($errno, $errstr, $errfile, $errline) {
      switch ($errno) {
          case E_ERROR:
          case E_PARSE:
          case E_CORE_ERROR:
          case E_COMPILE_ERROR:
          case E_USER_ERROR:
            ob_end_clean();
            $errorStr = "$errstr ".$errfile." 第 $errline 行.";
            if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);
            self::halt($errorStr);
            break;
          default:
            $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
            self::trace($errorStr,'','NOTIC');
            break;
      }
    }
</code>

但是thinkPHP 的自定义错误方法却想处理这些错误,这怎么可能呢,所以这样设计就没有意义了是吧。

明知道没用,我不知道这样设计意义何在,求解释!

还有这个问题:http://segmentfault.com/q/1010000002703753/a-1020000002703757 我理解是对的吧。

回复内容:

http://us.php.net/manual/zh/function.set-error-handler.php

以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

<code>   /**
     * 自定义错误处理
     * access public
     * @param int $errno 错误类型
     * @param string $errstr 错误信息
     * @param string $errfile 错误文件
     * @param int $errline 错误行数
     * return void
     */
    static public function appError($errno, $errstr, $errfile, $errline) {
      switch ($errno) {
          case E_ERROR:
          case E_PARSE:
          case E_CORE_ERROR:
          case E_COMPILE_ERROR:
          case E_USER_ERROR:
            ob_end_clean();
            $errorStr = "$errstr ".$errfile." 第 $errline 行.";
            if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);
            self::halt($errorStr);
            break;
          default:
            $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
            self::trace($errorStr,'','NOTIC');
            break;
      }
    }
</code>

但是thinkPHP 的自定义错误方法却想处理这些错误,这怎么可能呢,所以这样设计就没有意义了是吧。

明知道没用,我不知道这样设计意义何在,求解释!

还有这个问题:http://segmentfault.com/q/1010000002703753/a-1020000002703757 我理解是对的吧。

谢邀,我不是ThinkPHP用户,只能猜测一下。

这样设计的意义在于框架中使用trigger_error()触发一个用户级别的错误后,使用用户定义的函数产生对开发者友好的输出。

至于为什么会判断E_ERROR、 E_PARSE、 E_CORE_ERROR、E_COMPILE_ERROR我猜可能是作者想多了。

这个设计应该没有问题,很多框架都是自己管理捕获错误。优势是开发和线上你可以自己控制错误的显示信息,其次通过日志便于定位错误。

以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

测试了一下,ob_start()系列函数不能控制以上级别的错误输出,并且以上级别的错误也不能由用户来触发,即不能使用trigger_error触发。

实在不好意思,我不是 ThinkPHP 用户,也不喜欢这个东西,所以,没法儿帮到你哈

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn