由于E_警告,我是否需要在PHP中尝试/捕获opendir?

由于E_警告,我是否需要在PHP中尝试/捕获opendir?,php,Php,我正在为家庭作业制作一个小文件浏览器——我已经让它按我所需要的方式工作了,但是现在我正试图重构我的代码,对于如何处理PHP中的错误场景,我有点困惑 我已经习惯了C++/C#try/catch错误处理,PHP似乎有一些不同的版本。让我困惑的是: 资源opendir(字符串$path[,资源$context]) 成功时返回目录句柄资源,失败时返回FALSE 如果路径不是有效目录或无法打开该目录 由于权限限制或文件系统错误,opendir()返回 FALSE并生成级别为E_警告的PHP错误。你可以压制

我正在为家庭作业制作一个小文件浏览器——我已经让它按我所需要的方式工作了,但是现在我正试图重构我的代码,对于如何处理PHP中的错误场景,我有点困惑

我已经习惯了C++/C#try/catch错误处理,PHP似乎有一些不同的版本。让我困惑的是:

资源opendir(字符串$path[,资源$context])

成功时返回目录句柄资源,失败时返回FALSE

如果路径不是有效目录或无法打开该目录 由于权限限制或文件系统错误,opendir()返回 FALSE并生成级别为E_警告的PHP错误。你可以压制 opendir()的错误输出是在 函数名


我是否需要捕获上面提到的生成的PHP错误level E_WARNING,或者这样做是愚蠢的?我不明白为什么它会返回false并抛出一个错误-抛出的错误不应该使您无法正常返回吗?

警告应该只在测试/接受环境中抛出。通过将目录与false进行比较,可以安全地检查目录是否存在

if (opendir($dir) === false)
    echo "it failed!";

可以使用自定义错误处理程序捕获警告,该程序可以将警告写入日志文件,而不是在屏幕上显示警告。

您可以使用类似于
@
的simbol来抑制警告。这通常用于抑制资源处理程序警告,因为有时资源不可用,但应小心处理


在实时环境中,您应该关闭错误显示,因此它只在开发中有用,但它可能会破坏生成的页面,因此可能有助于抑制它。

您可以使用
捕获
来处理引发的
异常。PHP错误与此不同。PHP错误具有不同的级别或严重性。您可以使用修改输出这些错误中的哪一个。为了抑制语句中的单个PHP错误,请使用
@
,例如:
@opendir(…)因此,无法使用
try
/
catch
处理以这种方式产生的错误/警告,因为处理这些错误/警告的语言基础结构可以追溯到PHP支持的异常或
try
/
catch
之前

只有在使用更现代的PHP模块时,才能真正使用
try
/
catch
,这些模块使用类并生成异常,而不是错误和警告

PHP的大部分核心功能仍然基于旧的错误处理机制

使用
opendir()
应该做的第一件事是在尝试打开目录之前检查目录是否存在并可以打开它;这将防止您需要使用
opendir()
本身来处理错误情况

如果仍对抛出警告持谨慎态度,可以使用
@
符号抑制警告。请注意,这也会抑制真正的错误

或者,如果你真的很无聊,你可以为整个事情创建一个包装器,在调用之前更改
error\u reporting()
级别,然后再将其设置回原来的级别。如果有必要,您甚至可以让它为您抛出一个异常


因此,这些事情是可以做到的,但不太值得这么麻烦;您也可以接受这样一个事实,即PHP的错误处理并不出色,并且随着时间的推移而不断发展,而不是像C++/C#那样一开始就被仔细考虑。

这是PHP固有的不一致性的一个例子,PHP绝对是一种脚本语言。您无法使用try…catch捕捉警告。异常和错误/警告是两种不同机制的一部分,后来添加了异常。真是一团糟。用PHP编写东西时要非常小心:您所精通的语言(C++/C#)是一致的,PHP则不是。小心。小心使用
@
处理“错误”。这将抑制所有错误,而不仅仅是警告。请参阅PHP手册上的警告:我知道那里发生了一些有趣的事情。我在网上读到的第一个网站叫E_WARNING,这是一个例外,把我搞糊涂了。谢谢大家的提醒。这些解决方案都没有遵循代码气候指南