2

所以,我只是第一次开始了一些 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):

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

或者

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

4

3 回答 3

2

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

其次,您创建的文件名是空的,因此您需要检查或放置一个新文件名:

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

$ourFileName = "示例";

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

fclose($ourFileHandle);

于 2013-03-07T23:42:27.883 回答
2
  • 将(可捕获的)错误转换为异常:创建一个执行此操作的函数并使用set_error_handler().
  • 防止不良编码员的输出:使用ob_start()& ob_end_clean(),但更重要的是,尝试找出那个编码员住在哪里,并在他家门口拉屎。
  • 使用exit()或在他们的库中的人:立即转储库,根本die()没有理由信任该代码。

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

于 2013-03-07T23:43:13.947 回答
1

第一个:在 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();
}
于 2013-03-07T23:42:41.420 回答