【问题标题】:php exception not raised of fatal error,such as "class not exist"php 异常未引发致命错误,例如“类不存在”
【发布时间】:2016-03-12 08:22:42
【问题描述】:

我想 PHP 的异常系统会捕获所有的。但事实并非如此。

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

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

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

附言

我终于明白 php 引擎的“错误”不是使用土地代码的“异常”。如果要使用异常处理引擎“错误”,则应手动将所有“错误”包装在异常中。

【问题讨论】:

  • 致命错误不是异常,异常就是异常......我建议你先阅读exceptions
  • 无法捕获致命错误。他们不扔任何东西。如果你想“捕捉”这种事情,你必须注册一个错误处理程序/关闭脚本。
  • @MarkBaker 看过文档,请告诉我,文档在哪一行,说异常不能捕获错误,哪些错误不能被异常捕获
  • @MarkBaker我来自c++,c++中的所有错误都可以在异常中处理
  • 以及指向ErrorException的相关链接以及如何将错误转换为异常的示例

标签: php


【解决方案1】:

如果你想在一个类不存在的情况下抛出一个异常,你可以使用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 stable。我在在线 REPL 上使用 PHP 7 的 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 在问题的 cmets 中所指出的,您无法在以前的 PHP 版本中“捕获”fatal error

希望这会有所帮助:)

【讨论】:

  • 谢谢你!它真的帮助我理解错误和异常是 PHP 中的两个不同系统,如果你想捕获“错误”,你必须手动将“错误”包装在一个异常中
  • 没问题@lovespring :)
猜你喜欢
  • 2013-10-10
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多