PHP错误处理,当错误是文本消息而不是抛出异常
因此,我第一次开始一些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"
对于第一种:在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.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);
- 将(可捕获)错误转换为例外:创建一个函数,该函数使用使用
set_error_handler()
。 - 防止错误编码器的输出:使用
ob_start()
&ob_end_clean()
,但更重要的是,试着找出编码器的位置和位置。 - 在他们的图书馆中使用
exit()
或die()
的人:立即转储图书馆,没有理由对的有任何信任。
不幸的是,致命错误往往是致命的。没有例外。但是,这就是我们在error_log
(上)& display_errors
(关闭生产,在开发)指令。
哦,所以PHP中有很多不同类型的错误,其中大多数不是Exceptions。 但还有其他人根本无法抓到?这是否算“致命错误”?因为,那很烦人。从我的角度来看,我真的不在乎在某些被称为库的情况下发生了什么,在这种情况下以及许多其他情况下,即使解析失败,我也可以继续正常执行。但是,如果我无法捕捉到错误,则不是。 – Jonathon 2013-03-08 00:52:56
我看到他们是另一种类似的方法来捕捉他们。 我不知道我是否可以使用相同的函数来捕获两者。 – Jonathon 2013-03-08 00:58:39
我不明白最后的评论。关于致命错误,如果第三方库触发了致命错误,那么确实存在问题。这就像C中的一个段错误。 – hek2mgl 2013-03-08 00:59:16