我在类中有一些方法,我认为它可以用于测试内容,但在某些情况下,如果检查失败,程序可能想要完全停止。最初我在条件调用中包装,然后抛出一个异常,但是,我最终在许多方法中使用相同的if条件而且看起来很浪费,所以我在check方法中添加了一个布尔标志,让它抛出一个异常如果检查失败。一个例子:
public function isValidDirection($direction, $throwException = false) {
if(!in_array($direction, $this->getDirections()) && $throwException) {
throw new \InvalidArgumentException(sprintf('Invalid direction value. Valid directions are: "%s"', implode(", ", $this->getDirections())));
}
return in_array($direction, $this->getDirections());
}
这是个坏主意吗?我之前没有遇到过这种模式,我想知道它有什么陷阱吗?
答案 0 :(得分:2)
在特殊情况下应该抛出异常。这意味着当您的代码处于不准备处理的情况时。如果您的函数是验证函数,其作用是确认数据的有效性,则几乎不会出现任何异常错误。函数的工作很简单:接受输入,返回true
或false
,具体取决于它是否有效。如果您想通过抛出异常来处理无效输入的情况并且想要干掉那个重复检查,那么创建另一个包装验证函数的函数。所以你有两个函数:isValidDirection($input)
和assertIsValidDirection($input)
,后者如果无效则抛出异常,否则什么都不做。
function isValidDirection($input) {
return ...; // true or false
}
function assertIsValidDirection($input) {
if (!isValidDirection($input)) {
throw new InvalidArgumentException;
}
}
这使两个职能部门的职责明确,实施简单。
答案 1 :(得分:0)
是的,这是一个坏主意。如果方法进入无法继续或不应该进入的状态,则应抛出异常。它由调用代码来处理异常,因为它感觉是必要的或让程序崩溃。否则调用者不会忘记程序失败并将继续,并且通常会使情况变得更糟/更难调试。
如果您不想暂停程序,可以捕获异常并记录错误,或者根据您的具体情况以更优雅的方式处理它。如果您不希望所有程序中的错误都会崩溃(理想情况是在测试期间)并且错误不会传播;然后你就确切地知道在哪里修理它。
因此,如果我理解正确,如果$direction
中getDirections
不在public function isValidDirection($direction) {
if(!in_array($direction, $this->getDirections())) {
throw new \InvalidArgumentException(sprintf('Invalid direction value. Valid directions are: "%s"', implode(", ", $this->getDirections())));
}
return in_array($direction, $this->getDirections());
}
,您的代码就会抛出异常。
e.g:
getDirections
(另外,您不需要拨打{{1}} 3次,只需拨打一次并将其存储在变量中)