2013-03-07 135 views
2

因此,我第一次开始一些PHP开发。我正在尝试使用HTML DOM导航/解析库。我选了加农,但并不关心我最终使用哪一个。PHP错误处理,当错误是文本消息而不是抛出异常

但我已经注意到了,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):

"Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\hockey\ganon.php on line 238"

OR

"Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\hockey\ganon.php on line 19"

回答

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(); 
} 
+0

哦,所以PHP中有很多不同类型的错误,其中大多数不是Exceptions。 但还有其他人根本无法抓到?这是否算“致命错误”?因为,那很烦人。从我的角度来看,我真的不在乎在某些被称为库的情况下发生了什么,在这种情况下以及许多其他情况下,即使解析失败,我也可以继续正常执行。但是,如果我无法捕捉到错误,则不是。 – Jonathon 2013-03-08 00:52:56

+0

我看到他们是另一种类似的方法来捕捉他们。 我不知道我是否可以使用相同的函数来捕获两者。 – Jonathon 2013-03-08 00:58:39

+0

我不明白最后的评论。关于致命错误,如果第三方库触发了致命错误,那么确实存在问题。这就像C中的一个段错误。 – hek2mgl 2013-03-08 00:59:16

2

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

其次,你的文件名,你被创建为空,所以你需要检查或放置一个新的文件名:

您需要创建一个文件名或写入一个新的文件名才能访问它。创建一个文件为例:

$ourFileName = "example";

$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");

fclose($ourFileHandle);

2
  • 将(可捕获)错误转换为例外:创建一个函数,该函数使用使用set_error_handler()
  • 防止错误编码器的输出:使用ob_start() & ob_end_clean(),但更重要的是,试着找出编码器的位置和位置。
  • 在他们的图书馆中使用exit()die()的人:立即转储图书馆,没有理由对有任何信任。

不幸的是,致命错误往往是致命的。没有例外。但是,这就是我们在error_log(上)& display_errors(关闭生产,在开发)指令。