我有一个名为functions.php
的文件。
此文件包含所有其他功能文件,例如:
include_once("user_functions.php");
include_once("foo_functions.php");
我想抓住错误,当我在其中一个文件中拧一个代码时,它不会给整个系统带来错误。
例如,如果foo_functions.php
中存在解析器错误,则不会将其包含在functions.php
中。
这可能吗?
答案 0 :(得分:4)
Parser错误是致命错误,因此您无法catch
这些错误。 See this question and answer for more details
如果您可以exec()
运行{em> 可以执行的操作,请致电php -l thefilename.php
并检查结果。 See the manual for information on how this works。但是这里有一些问题:
exec()
经常被禁用,因为使用它的安全风险极高。答案 1 :(得分:4)
从PHP 7开始,可以捕获大多数eval / include错误,例如ParseError:
try {
include_once(__DIR__ . '/test.php');
} catch (\Throwable $e) {
var_dump($e);
}
答案 2 :(得分:1)
此代码可以检查文件是否存在,如果文件存在而不包含它。
<?
if(!is_file('user_functions.php')){
//There is no file user_functions.php . You may use file_put_contents('user_functions.php','<? //content ?>');
}else{
//ther is file user_functions.php, so include it.
include 'user_functions.php';
}
?>
这可以帮助您获得语法错误(仅适用于PHP 7 +)
<?
try {
include('user_functions.php');
}catch (ParseError $e) {
echo 'Error: '.$e->getMessage();
//syntax error, unexpected end of file, expecting ',' or ';'
}
?>
因此,如果您使用PHP 7+,则可以使用:
<?
if(!is_file('user_functions.php')){
echo 'Error: file is not exist';
}else{
//check errors
try {
include('user_functions.php');
}catch (ParseError $e) {
echo 'Error: '.$e->getMessage();
//syntax error, unexpected end of file, expecting ',' or ';'
}
}
?>
答案 3 :(得分:0)
如果你把
怎么办?error_reporting(E_ALL);
ini_set("display_errors", 1);
在foo_functions.php的开头?
答案 4 :(得分:0)
include()
和include_once()
如果失败则会返回false
。您可以使用它来检查include
d文件是否成功。
if (!include('user_functions.php'))
echo 'user functions failed to include';
if (!include('foo_functions.php'))
echo 'foo_functions failed to include';
通过更改echo
来处理错误逻辑,您应该可以按照自己的要求进行操作。
答案 5 :(得分:0)
我使用的解决方案感觉就像一个创可贴解决方案,但它会让你控制回来。
这个想法是使用&#34; eval()&#34;首先检查错误。另外,在开头忽略@的错误。当然,你需要小心使用eval,所以不要让用户向它提供任何东西。
// first "eval" the file to see if it contains errors
$txt = file_get_contents($template_filename);
// eval starts out in php-mode. get out of it.
$txt = '?' . '>' . $txt;
ob_start();
$evalResult = @eval($txt);
ob_end_clean();
// if there are no errors
if($evalResult !== FALSE) {
require($template_filename);
} else {
error_log(print_r(error_get_last(), TRUE));
}
请注意我认为&#34; file_get_contents
+ eval
&#34; =&#34; require
&#34;或非常接近它,因此您可以跳过要求部分。