尝试/捕获块太多。这是对的吗?

时间:2014-04-25 14:28:51

标签: php try-catch

我有一个Input辅助类,如果源数组索引未定义,则抛出异常。

所以,如果我有类似的东西:

$input = new Input($_GET, $_POST);

$input->get("var1");
$input->get("var2");
$input->get("var3");
$input->get("var4");

现在是:

$input = new Input($_GET, $_POST);

try {
    $input->get("var1");
} catch(Exception $e) {
    //handle it
}

try {
    $input->get("var2");
} catch(Exception $e) {
    //handle it
}

try {
    $input->get("var3");
} catch(Exception $e) {
    //handle it
}

try {
    $input->get("var4");
} catch(Exception $e) {
    //handle it
}

如果我要将所有内容放入1 try catch块中,我不知道如何使用更少的try catch块而不必停止执行更多代码。

这是使用try catch函数的正确方法吗?

4 个答案:

答案 0 :(得分:3)

为什么不这样:

try {
    $input->get("var1");
    $input->get("var2");
    $input->get("var3");
    $input->get("var4");
} catch(Exception $e) {
    //handle it
}

答案 1 :(得分:1)

你真的需要单独处理每个例外吗?例如将

try {
   $input->get('var1');
   $input->get('var2');
   $input->get('var3');
   $input->get('var4');
} catch (Exception $e) {
  ... do something
}

同样工作?使用此构造,任何失败的get()调用都将触发catch,并且不会执行进一步的get()调用。例如,如果var2抛出,则永远不会得到var3和var4。

答案 2 :(得分:0)

我没有添加这么多尝试捕获。 开发和维护是一件痛苦的事。 如果你能把它推回一种方法,你会感谢自己。

我建议的更好:

if(isset($input->get("var4")))
$input->get("var4")

function get($name){
 if(isset($this->get($name)))
   return $this->get($name);

 return false; //or throw an exception/error here :)
}

答案 3 :(得分:0)

这取决于你想要达到的目标。如果你想在任何getter失败后中断代码执行,你应该使用HeroFTime解决方案。如果你想分别处理每个getter,最好编写一个封装try / catch的函数,如下所示:

function getter($input, $value) {
  try {
     return $input->get($value);
  } catch(Exception $e) {
     return null; // or any default value you'd like to provide
  }
}