【问题标题】:PHP Error Handling, when the error is a text message instead of a thrown ExceptionPHP 错误处理,当错误是文本消息而不是抛出的异常时
【发布时间】:2013-03-07 23:35:08
【问题描述】:

所以,我刚刚开始了一些 PHP 开发。我正在尝试使用 HTML DOM 导航/解析库。我选择了 ganon,但并不真正关心我最终使用的是哪一个。

但我马上注意到 PHP 与我见过的所有其他编码语言有着根本的不同。当我查看错误处理时,这一点非常明显。如果一个包含的类/脚本只是打印它的错误,我不能简单地用 try/catch 捕获它。我相信这就是这里正在发生的事情。我没有控制权,即使我是告诉 file_get_dom 运行的人。它可以做任何它想做的事情,并将它想要的任何东西写入生成的 HTML 文件。

这是不好的做法,它肯定把我搞砸了。解决办法是什么?我可以捕捉到它试图写的文本(用隐藏的 div 包围它)吗?但是,在我想阻止这个类写任何它想要的东西的同时,我也知道如果发生错误,我可以采取适当的步骤。

注意:做更多的测试,即使我抛出自己的错误或使用“或死”,它并没有完全符合我的预期。所以也许我也只是不知道如何使用 Try/Catch,即使我已经在一些教程中看到它与此完全一样。但即使这是一个语法错误,我最初的问题仍然存在,如何控制包含的类,以免它们污染我的 html 文件。

<?php
try{
 include_once('ganon.php');
}catch(Exception $e){ echo  "OUT: $e->getMessage()"; }

class GamesSummery{
  public function __construct(){

    try{
        $html = file_get_dom('web site adress');
    }catch(Exception $e){ echo "Main: $e->getMessage()"; }
  }
}    $test = new GamesSummery();

输出(S):

“致命错误:超过 30 秒的最大执行时间 C:\xampp\htdocs\hockey\ganon.php 在第 238 行"

"警告:file_get_contents():文件名不能为空 C:\xampp\htdocs\hockey\ganon.php 第 19 行"

【问题讨论】:

    标签: php error-handling try-catch


    【解决方案1】:

    首先,增加你的php.ini执行时间,set_time_limit:http://php.net/manual/en/function.set-time-limit.php

    其次,你创建的文件名是空的,所以你需要检查或输入一个新的文件名:

    您需要在访问之前创建一个文件名或写入一个新文件名。以创建文件为例:

    $ourFileName = "示例";

    $ourFileHandle = fopen($ourFileName, 'w') or die("无法打开文件");

    fclose($ourFileHandle);

    【讨论】:

      【解决方案2】:
      • 将(可捕获的)错误转换为异常:创建一个执行此操作的函数并使用set_error_handler()
      • 防止不良编码员的输出:使用ob_start()ob_end_clean(),但更重要的是,尝试找出该编码员的住所并在他家门口拉屎。
      • 在他们的库中使用 exit()die() 的人:立即转储库,没有理由信任该代码根本

      不幸的是,致命错误通常是……致命的。没有例外。但这就是我们有 error_log (on) & display_errors (off in production, on dev) 指令的地方。

      【讨论】:

        【解决方案3】:

        对于第一个:在 php 中有 致命 错误,例如语法错误(和其他)无法被捕获。在这种情况下程序将立即终止。


        对于所有其他人,有一种使用set_error_handler() 的方法。

        我为您准备了一个自定义错误处理函数,它将所有错误或警告转换为异常。请注意,函数的输出(我注册它的方式)取决于 php.ini 设置error_reporting

        首先注册错误处理程序:

        set_error_handler('errorHandler', ini_get('error_reporting'));
        

        函数本身来了:

        function errorHandler(
                    $errno,
                    $errstr,
                    $errfile = null,
                    $errline = null,
                    $errcontext = null
        ) {
            $message = sprintf("%s: %s, file: %s, line: %s",
                $errno, $errstr, $errfile, $errline
            );
            // -->
            throw new ErrorException($message, 0, $errno, $errfile, $errline);
        }
        

        你可以试试下面的代码:

        try {
           $a = 1 / 0; // will throw a warning
        } catch ( Exception $e) {
           echo $e->getMessage();
        }
        

        【讨论】:

        • 哦,原来PHP中有很多不同类型的错误,而且大部分都不是异常。但是还有其他人根本无法抓住吗?这算“致命错误”吗?因为,那很烦人。从我的角度来看,我真的不在乎在某些称为库中发生了什么,在这种情况下以及许多其他情况下,即使解析失败,我也可以正常继续执行。但如果我无法捕捉到错误,则不会。
        • 我看到它们也是另一种类似的捕捉它们的方法。我想知道我是否可以使用相同的函数来捕获两者。
        • 我不明白最后的评论。关于致命错误,如果第三方库触发了致命错误,那么您确实有问题。这就像 C 中的段错误。
        • 哦,刚刚注意到:register_shutdown_function( "fatal_handler" ); 存在。
        • @JonathonWisnoski 几年前我问过一个关于 SO 的相关问题。答案可能对您来说很有趣:stackoverflow.com/questions/3412676/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2021-03-24
        相关资源
        最近更新 更多