【发布时间】:2014-01-25 11:25:22
【问题描述】:
我正在学习异常处理。我已经知道如何使用它们,但是我不知道什么时候可以使用它们,因为很少有教程能告诉你有关这方面的任何见解。我的代码:
// 0-index part of the url
public function part($Part)
{
if (!is_numeric($Part))
throw new Exception('The argument for $Url->part() should be numeric');
$Part = (int) $Part;
if ($Part < 0)
throw new Exception('The argument for $Url->part() should be positive');
if ($Part > count($this->parts))
return false;
return $this->parts[$Part];
}
感觉我的代码异常太多了。它是检索当前 url 及其某些部分的代码的一部分。例如,/this/is/a/test/ 将在 $this->parts 中保存为 array('this', 'is', 'a', 'test')。
我是否在该方法中使用了太多异常,从而影响了可读性?如果出现任何问题,我是否应该只使用一个异常,使调试稍微困难但更容易阅读源代码?
这是问题中命名的更通用的异常:
// 0-index part of the url
public function part($Part)
{
if (!is_numeric($Part) || intval($Part) < 0 || intval($Part) > count($this->parts))
throw new Exception('The argument for $Url->part() is not correct');
return $this->parts[(int) $Part];
}
【问题讨论】:
-
您愿意处理和引发越界异常吗?
-
我通常不会使用那么多异常,但不是因为可读性。如果你这样做,你必须在每次调用
part()时处理(try/catching)你的错误。我个人会在出现任何错误时返回false,并且在调用part()时,请在继续之前检查是否有有效的返回。 -
OP,回答“我什么时候应该使用...”异常处理问题,您会问“我什么时候知道它失败的原因很重要?”。 catch all 'return false' 或 'return null' 是草率的代码,除非不需要知道其他任何内容。 IE 像 isValid() 这样的函数应该返回 true/false,但是当某些东西被微调时,比如一个值必须是一个特定范围内的数字,那么了解失败的原因很重要。
-
验证用户输入不是异常情况:异常应该用于异常(“例如数据库已消失”)而不是常规表单验证,其中无效的用户输入是正常而不是异常情况
-
即便如此,它仍然不是“整个互联网崩溃”这样的异常情况
标签: php oop exception object methods