Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何捕获函数“上的错误”;包括「;PHP?_Php_Exception Handling_Try Catch - Fatal编程技术网

如何捕获函数“上的错误”;包括「;PHP?

如何捕获函数“上的错误”;包括「;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(

我需要捕获函数“include”PHP的最后一个错误

我使用函数“Exceptions”进行测试,但不幸的是,我在上面写了函数“include”

如果在函数“include”之后写入,则不会显示异常

示例1:

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 succession
php-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”;”