2011-09-24 37 views
5

我正在为作业做一个小文件浏览器 - 而且我的工作和我需要的一样好,但是我现在对PHP中的错误场景感到有点困惑,因为我正试图重构我的编码。由于E_WARNING,我是否需要尝试/捕获PHP中的opendir?

我习惯了C++/C#try/catch错误处理,其中PHP似乎有一些变体。什么是困惑我的是:

资源执行opendir(字符串$ PATH [,资源$背景])

成功则返回目录句柄资源,或FALSE的失败。

如果路径由于权限限制或文件系统错误而无法打开 ,则opendir()返回 FALSE并生成级别为E_WARNING的PHP错误。您可以通过在 函数名称的前面加上'@'来抑制opendir()的错误输出 。

http://php.net/manual/en/function.opendir.php

我是否需要捕获在那里提到的E_WARNING级别生成的PHP错误,还是很愚蠢?我不明白为什么它会返回false并抛出一个错误 - 不应该错误抛出使它,所以你不正常返回?

+3

这是一个PHP内在不一致的例子,它绝对是一种*脚本*语言。你不会用try ... catch来捕捉警告。异常和错误/警告是两种不同机制的组成部分,并且稍后会添加例外。这相当混乱。在PHP中非常小心谨慎地编写代码:您在C++/C#中的专家级语言是一致的,PHP不是。小心。 – gd1

+0

小心使用'@'来处理“错误”。这将抑制所有错误,而不仅仅是警告。查看PHP手册中的提示:http://www.php.net/manual/en/language.operators.errorcontrol.php –

+1

我知道有一件有趣的事情发生在那里。我读到的第一个网站叫做E_WARNING,这个例外让我感到困惑。谢谢你们。 –

回答

7

您将使用catch为了处理提出的Exception。 PHP错误是不同的。 PHP错误有不同的级别或严重性。您可以使用error_reporting()来修改输出哪些错误。为了抑制在一份声明中个别PHP错误,请使用@,如:@opendir(..)

1

警告只应在测试/接受环境中引发。您可以安全地检查是否比较强存在,它与假

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

华林目录可以用它可以将它写入日志文件,而不是显示在屏幕上有一个自定义错误处理程序捕获。

1

您可以用@ simbol像@opendir()那样禁止警告。这是禁止资源处理程序警告的常见操作,因为有些情况下资源不可用,但应该小心处理这些资源。

在现场环境中,您应该显示错误消息,所以它只在开发过程中有用,但它可能会破坏您生成的页面,因此可能会抑制它。

2

错误/以这种方式产生的警告,因此不能使用try/catch,因为处理这些语言的基础设施可以追溯到支持PHP前处理例外或try/catch

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

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

你应该用opendir()做的第一件事是检查目录是否存在,并且可以在你打开它之前打开;这将防止您需要处理与opendir()本身的错误条件。

如果您仍然对引发的警告持谨慎态度,则可以使用@符号来禁止警告。请注意,这也会抑制真正的错误。

或者,如果您真的很无聊,您可以为整个事情创建一个包装,这会在拨打电话之前更改error_reporting()级别,并在之后再次设置。如果有必要,你甚至可以为你抛出异常。

所以这些东西都可以做到,但不值得冒险;你可能只是认为PHP的错误处理并不好,并且随着时间的推移而发展,而不是像C++/C#那样被认真考虑。

+0

这些解决方案都不符合Code Climate准则 –