PHP中的错误和异常有什么区别?

时间:2010-08-09 12:01:31

标签: php

我是PHP的初学者。到目前为止,从我学习的来源,触发异常的唯一机制是写一条引发它的行。

throw new Exception('message')

此外,在下面的代码中,不会抛出任何异常,但会引发错误。

try
{
    $file = fopen('no such file.txt', 'r');
}
catch(Exception $e)
{
    echo 'Exception: ' . $e->getMessage();
}

请给我一些解释。 看起来这个try..catch块在PHP中并不那么有用,与Java或.NET不同。

3 个答案:

答案 0 :(得分:3)

按照惯例,PHP内核中的函数不会抛出异常(唯一的例外是构造函数可能会抛出异常,因为没有其他方法可以正确地指示错误条件)。

一些差异:

  • 例外有类型,您可以根据其类型捕获它们。错误只有相关级别(E_WARNINGE_STRICTE_NOTICE,...)。
  • 可以在调用堆栈中的任何位置捕获异常,否则它们将转到默认的异常处理程序。错误只能在定义的错误处理程序中处理。

答案 1 :(得分:2)

“错误”仍然是来自php的pre-oop时代,并且在现代代码中确实几乎没用。幸运的是,您可以(实际上,必须)自动将大多数“错误”转换为异常。神奇就像这样

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

答案 2 :(得分:0)

在这种特定情况下没用,因为fopen()在遇到错误时不会抛出异常。我认为没有核心功能可以做到。

如果您习惯使用异常并希望与它们保持一致,我认为没有任何反对使用ErrorException类将所有错误转换为异常的说法。

但是,fopen()在无法打开文件时只会引发E_WARNING,所以在您的示例中,最简单的方法是测试$filefalse是否为file_exists()看操作是否失败。

我个人也喜欢在fopen()之前做{{1}},如果文件丢失,也会做出相应的反应。