如何捕获函数“上的错误”;包括「;PHP?
我需要捕获函数“include”PHP的最后一个错误 我使用函数“Exceptions”进行测试,但不幸的是,我在上面写了函数“include” 如果在函数“include”之后写入,则不会显示异常 示例1:如何捕获函数“上的错误”;包括「;PHP?,php,exception-handling,try-catch,Php,Exception Handling,Try Catch,我需要捕获函数“include”PHP的最后一个错误 我使用函数“Exceptions”进行测试,但不幸的是,我在上面写了函数“include” 如果在函数“include”之后写入,则不会显示异常 示例1: try{ throw new exception(); require_once( $this->controller['path'] ); } catch( exception $e ) { print_r(
try{
throw new exception();
require_once( $this->controller['path'] );
}
catch( exception $e )
{
print_r( error_get_last() );
}
try{
require_once( $this->controller['path'] ) OR throw new exception();;
}
catch( exception $e )
{
print_r( error_get_last() );
}
此返回:…(无效)
示例2:
try{
throw new exception();
require_once( $this->controller['path'] );
}
catch( exception $e )
{
print_r( error_get_last() );
}
try{
require_once( $this->controller['path'] ) OR throw new exception();;
}
catch( exception $e )
{
print_r( error_get_last() );
}
此返回:分析错误:语法错误,意外的T\U插入
我故意在要包含的文件中创建了一个语法错误。其思想是捕获错误,以便您可以调试它们 有人知道怎么得到这个吗
伙计们!我需要捕捉语法错误。你好
require\u once
是一种语言结构,而不是一个函数,你不能用它短路
要在包含文件之前测试该文件是否存在,可以使用is\u file()
。如果要测试文件是否可读,可以使用is\u readable()
您可能还想使用
include
,它会发出E\u警告
如果找不到文件,而不是E\u编译错误
,我同意alex的观点,请尝试通过检查文件存在()来处理错误,然后使用异常
if(file_exists($this->controller['path'])){
try{
require_once( $this->controller['path'] );
}catch(Exception $e){
// throw error
}
}
或者使用是可读的()
大多数本机PHP函数都会触发错误,而不是引发异常。要将PHP错误转换为异常,可以设置自定义错误处理程序:
function exceptions_error_handler($severity, $message, $filename, $lineno) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
set_error_handler('exceptions_error_handler');
有了这段代码,您将能够捕获所有作为异常的非致命错误。请注意,require.*
函数会抛出致命错误,因此您必须改用include
至于处理代码本身的语法错误,如果你仔细考虑一下,这是不可能的。首先,如果你使用require
,如果文件无法包含,它总是会杀死你的应用程序。结果是无法控制的,事后你什么也做不了。如果要控制文件包含的成功,请使用include
并测试其返回值
$success = include "foo.php";
if (!$success) {
// the file could not be included, oh noes!
}
在这一点上,你可以有语法上的差异,比如:
if (!(include "foo.php")) ...
如果无法包含文件(您无法捕获),这将触发E_通知。但这没关系,因为它将帮助您调试问题,并且错误的显示将在生产中关闭(对,对吗?)
或throw new Exception
不起作用,因为throw
是一条语句,不能在需要表达式的地方使用
如果您想捕获包含文件中的语法错误,请使用/it's successionphp-l
他不想测试文件是否存在,我相信,而是想测试文件是否可读……哈哈,这有点滑稽。包含意味着读取,因此,它变成了“要测试文件是否可读,可以使用is_file()。如果要测试文件是否可读,可以使用is_readable()。”:)伙计们!我需要捕捉语法错误。你好@奥兰德森特里斯克尔:你不能。语法错误在标记化级别失败。到那时你的代码还没有开始执行。您可以包含该文件,并对各个文件运行token\u get\u all()
。不确定如果出现解析错误(可能是空数组)会发生什么?为什么要测试语法错误?您必须在开发时执行此操作,而不是在运行时。就我个人而言,我不会费心捕捉任何和所有错误,例如文件包含错误。包含其他必需的文件是一件非常基本的事情,如果这样做不起作用,那么应用程序布局中的某些内容将从根本上被破坏。如果应用程序甚至不能在该级别工作,那么它应该尽快死掉,并显示一条错误消息,这正是require
所做的。你只需要在某个时候引导应用程序,包括所有需要的依赖项是该步骤的一部分。它还不属于“需要优雅地处理”类别。@Col如果应用程序甚至找不到它的所有包含文件,它显然从未运行过。无论如何,用户都不应该看到这种情况下的代码。通常这会导致web服务器抛出错误500页,您可以自定义该页。如果你真的想在PHP中处理这个问题,请参阅我的答案。你确定包含的文件中没有语法错误吗?!这可能是您的问题吗?我故意在要包含的文件中创建了一个语法错误。这样做的目的是捕获错误,以便您可以调试它们。@Olaf然后请清楚地说明语法错误在包含的文件中!请参阅更新的答案。如果foo.php
的主体为返回FALSE,则此操作是否会失败代码>?如果您想知道include是否成功,如果没有找到include文件,您可能希望抑制通常的PHP错误消息。这样做:“$success=@include“foo.php”;”