php异常未引发致命错误,如“;类不存在”;


php exception not raised of fatal error,such as "class not exist"

我想PHP的异常系统会包罗万象。但事实并非如此。

try{ 
    $obj = new Asdfasdfasdf()
} catch(Exception $e){
    trace(...something...)
}

但它并没有捕捉到这种错误,我搜索了php文档,在try,catch子句中没有说明哪种异常/错误是可以捕捉的。

那么,我怎么知道哪种异常/错误会被我的catch子句捕获呢?

p.S.

我终于明白php引擎的"错误"并不是使用land代码的"例外"。如果要使用异常来处理引擎"error",则应手动将所有"error"包装在异常中。

如果您想在类不存在的情况下引发异常,可以使用class_exists()

一个天真的例子可能看起来像:

function createClass($class)
{
    if (!class_exists($class)) {
        throw new Exception(
            sprintf('Class %s does not exist', $class)
        );
    }
    return new $class;
}
try {
    $asdfasdfasdf = createClass('Asdfasdfasdf');
} catch (Exception $e) {
    echo $e->getMessage();
}

根据我的经验,当找不到类时,大多数PHP框架都会抛出某种异常——例如,Symfony2抛出ClassNotFoundException。也就是说,我不知道你是否能"抓住"它,它可能真的只是一种发展援助。

PHP 7刚刚发布,根据我从规范中了解到的情况,您将能够将fatal error捕获为EngineException。我不知道这是否适用于你的例子;我还没有测试它,因为我还没有安装PHP 7稳定版。我在一个在线REPL上用PHP7的alpha版本尝试了您的例子,但它似乎不起作用。

然而,为了完整起见,这里有一个来自RFC的例子:

function call_method($obj) {
    $obj->method();
}
try {
    call_method(null); // oops!
} catch (EngineException $e) {
    echo "Exception: {$e->getMessage()}'n";
}
// Exception: Call to a member function method() on a non-object

无论如何,正如@MarkBaker和@MarcB在问题评论中所指出的,在以前的PHP版本中,您无法"捕获"fatal error

希望这有帮助:)