PHP中错误和异常有哪些区别?

4
我是一名PHP初学者。目前,我从学习来源中了解到,唯一触发异常的机制是编写抛出异常的代码行。 throw new Exception('message') 此外,在下面的代码中,不会抛出任何异常,但会引发错误。
try
{
    $file = fopen('no such file.txt', 'r');
}
catch(Exception $e)
{
    echo 'Exception: ' . $e->getMessage();
}

请给我一些解释。 在PHP中,与Java或.NET不同,这个try..catch块似乎并不是很有用。

3个回答

4
按照惯例,PHP核心中的函数不会抛出异常(唯一的例外是构造函数可以抛出异常,因为没有其他方式可以正确地信号化错误条件)。
一些区别:
- 异常有类型,您可以根据它们的类型捕获它们。错误只有一个关联级别(E_WARNING,E_STRICT,E_NOTICE等)。 - 可以在调用堆栈的任何点捕获异常,否则它们将转到默认的异常处理程序。只能在定义的错误处理程序中处理错误。

3
“错误”是php面向对象之前的遗留问题,在现代代码中几乎没有什么用处。幸运的是,您可以(实际上必须)将大多数“错误”自动转换为异常。这个魔法就像这样:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

一旦你完成了这个步骤,你的"fopen"代码片段将按预期工作。更多细节和讨论请参见http://php.net/manual/en/class.errorexception.php


0

在这种特定情况下,它并不实用,因为 fopen() 在遇到错误时不会抛出异常。我认为核心函数中没有一个会抛出异常。

如果您习惯于使用异常并希望始终与它们保持一致,我认为没有什么不可以使用 ErrorException 类将所有错误转换为异常。

然而,fopen() 仅在无法打开文件时抛出 E_WARNING,因此在您的示例中,最简单的方法是测试 $file 是否为 false 以查看操作是否失败。

我个人也喜欢在使用 fopen() 之前进行 file_exists() 操作,并根据文件是否缺失做出相应反应。


1
我对你最后的建议有些保留。对于本地文件来说还好,但如果文件实际上是一个http url,那么这会比简单检查fopen的返回值造成更多的延迟,而且还要屏蔽错误消息(可以使用error_get_last()获取)。 - Artefacto
@Artefacto 对于http URL,我同意。 - Pekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接