PHP错误处理,当错误是文本消息而不是抛出异常时


PHP Error Handling, when the error is a text message instead of a thrown Exception

所以,我刚刚开始一些PHP开发的第一次。我试图使用HTML DOM导航/解析库。我选了ganon,但我并不在乎最后用哪个。

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

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

注意:做更多的测试,甚至当我抛出自己的错误或使用"or die"时,它并没有做我所期望的,确切地说。所以也许我也只是不知道如何使用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' gon .php on line 238"

"警告:file_get_contents(): Filename不能为空C:'xampp'htdocs'hockey' gon .php on line 19"

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

第二,你创建的文件名是空的,所以你需要检查或添加一个新的文件名:

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

$ourFileName = "example";

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

文件关闭($ ourFileHandle);

  • 将(可捕获的)错误转换为异常:创建一个函数来执行此操作&使用set_error_handler() .
  • 防止不良编码器输出:使用ob_start() &ob_end_clean(),但更重要的是,试着找出那个编码器住在哪里,在他的家门口拉屎。
  • 在库中使用exit()die()的人:立即转储库,根本没有理由信任这些代码

不幸的是,致命错误通常是…致命的。没有例外。但这就是我们有error_log (on) &

display_errors(在生产中关闭,在开发中打开)指令

对于第一个:在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();
}