【问题标题】:Too many try/catch blocks. Is this proper?太多的 try/catch 块。这合适吗?
【发布时间】:2014-04-25 14:28:51
【问题描述】:

如果源数组索引未定义,我有一个 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函数的正确方法吗?

【问题讨论】:

  • 您可能有一个 try{ ... }catch 阻止所有 4 个 $input->get 呼叫。我猜不出为什么var1 上的异常处理方式与var2 不同。毕竟,例外通常是针对特殊情况的!
  • 是的,但我的问题是,如果第一次调用时发生异常,它将停止执行进一步的$input->get() 调用。

标签: php try-catch


【解决方案1】:

为什么不这样:

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

【讨论】:

  • 如果 var1 将失败,所有将失败因此这不是想要的结果
  • 有趣的是,它与接受的答案中的代码相同,这是第一个回答的代码。 @user3232725 虽然没有给出进一步的解释,但仍然可以接受。
【解决方案2】:

您真的需要单独处理每个异常吗?例如会

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

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

【讨论】:

    【解决方案3】:

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

    我更推荐的是:

    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 :)
    }
    

    【讨论】:

    • 这个问题的一个问题是get 方法可能正在做一些资源或时间密集型的事情,而您每次想要get 某事时都会调用它两次。
    【解决方案4】:

    这取决于您想要实现的目标。如果您想在任何 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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多