PHP替代处理格式错误的输入而不是抛出错误

时间:2010-10-11 18:56:22

标签: php error-handling

PHP语言中有很多功能(最真实的),当他们不喜欢他们的输入时,会发现所有烦恼并发出警告和通知 - 而不是仅仅返回FALSE(尽管他们这样做)太)。

这一点非常普遍,在GD和字符串函数中。他们非常关注他们的论点,用户输入很容易达不到他们的标准。

例如,用户上传损坏的图像(有意或无意)。导致GD库发出警告。

到目前为止,我发现只有三种方法可以让PHP在这个问题上保持沉默:

  • 更改ini中的错误报告设置或at runtime yuck )。
  • 使用慢@符号来抑制错误。
  • 在功能之前/之后更改错误报告:
像这样:

$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...code that generates notices
error_reporting($errorlevel);

当然,后两个选择只会让我生病。这让我使用1)并淡化PHP错误设置。但是,我希望PHP处于严格模式,这样当我工作时,我可以捕获逻辑错误和可能蔓延到我的代码中的错误形式。但是,当PHP不喜欢某些东西时,我不想抛出随机错误。

那么有没有办法将错误的参数(错误输入)的错误与错误编程的错误分开?例如:

  1. 如果用户图像无效,则返回FALSE,我将处理它。我不需要警告。
  2. 如果我将图像资源传递给print函数是无效的抛出警告。

6 个答案:

答案 0 :(得分:3)

还有另一种选择 - 使用set_error_handler(),您甚至可以在GD函数调用之前调用它,并使用restore_error_handler()返回默认值。

在问题try and catch a warning中有一个很好的评论,它提供了有关如何实现这一目标的更多细节。

答案 1 :(得分:2)

这是一个从PHP开始的错误设计。一个现代的PHP库会在出错时引发异常。可能会遇到异常。但当时GD写的PHP还没有支持例外。

因此,我认为在这种情况下 合法使用@运算符。

答案 2 :(得分:1)

修复代码

在调用函数之前清理输入。这可以节省您的错误。

答案 3 :(得分:1)

除了编辑违规库并更改抛出异常的方式之外,所有库都没有通用方法。 Honeslty,很多PHP开发人员真的不关心被抛出的异常,但现在越来越多的人开始使用E_STRICT旅行车了。当生成GD库时,心态可能是抛出无法捕获的错误并不是一件大事。

至于GD的验证图像。您唯一能做的就是使用不同的库或函数来验证图像。您可以try using magic byte functions检查图像是否有正确的标题(尽管这并不意味着文件的其余部分结构正确)。至少使用魔术字节函数可以处理显而易见的事情,比如有人上传文本文件而不是JPEG。

答案 4 :(得分:0)

如果有类似内容,您可以使用@-operator

它不是一个干净的解决方案,但有些情况下,它是不可或缺的。

在使用getimagesize()之前检查过图像了吗?

答案 5 :(得分:0)

  

但是,我不想随意   PHP不喜欢时抛出的错误   东西。

为什么不呢? PHP试图通过警告和通知告诉您一些值得注意的事情。在GD示例中,您将要在用户上载损坏的文件时进行记录 - 尤其是在攻击中使用它时。 Turn of the display of error messages and log everything