【问题标题】:Good Programming Practice regarding Exception Handling关于异常处理的良好编程实践
【发布时间】:2011-07-29 20:53:55
【问题描述】:

考虑一个函数层次结构,函数 Four() 调用 Three(),后者调用 Two(),后者再次调用 One() 来完成工作:

Function One($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  }
  // .......... Do the Job ................
}
Function Two($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     One($x);
  }
}
Function Three($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     Two($x);
  }
}
Function Four($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     Three($x);
  }
}

如果我用一个字符串值调用四个,它会导致一个异常发生。

现在考虑只在父函数中有异常的代码。

Function One($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  }
  // .......... Do the Job ................
}
Function Two($x) {
     One($x);
}
Function Three($x) {
     Two($x);
}
Function Four($x) {
     Three($x);
}

这里,我调用 Four() 并传递一个字符串,它也会导致发生异常。

那么哪一个是最佳实践,为什么?
当我开始编写代码时,我最终会编写很多异常处理,请帮助。

【问题讨论】:

  • 其实php在抛出异常方面并没有像JAVA那么远。在java中,如果有可能引发异常,则必须使函数成为抛出函数,以便代码的用户实际上会看到可能存在异常。在 php 中,您将独自一人,而在第二个示例中,仅通过查看 Four 您将无法直接判断可能存在异常。所以第一个会是更好的做法。
  • 我只在类方法中使用异常,在函数中我使用错误。
  • 但是如果你做了一个很好的文档并声明这个特定的函数可能会在函数文档中抛出异常,那么第二个例子也应该没问题。

标签: php exception


【解决方案1】:

here你可能会找到答案:

【讨论】:

    【解决方案2】:

    我认为这在很大程度上取决于函数的用途。

    如果x 的值对函数至关重要,则应在该函数中处理异常。如果只是用来传参数,那你可以让它溜到最后一个函数。

    我不确定引擎如何评估函数处理,但大多数情况下它会将其内容推送到堆栈上,然后进行必要的跳转,这反过来会导致延迟,因此最好在当时和那里合并异常处理,当值生成时,而不是让它无用地流动直到它被使用只是为了节省无用的处理时间。

    一般来说,异常意味着你有浪费的计算。所以模型 1 会确保你不会这样做。

    服务器处理对所有人来说都是宝贵的...... :)

    【讨论】:

      【解决方案3】:

      IME 最好的做法是尽可能接近问题。话虽如此,我认为选项1是要走的路。这使得当异常发生时,您可以确信是对 Four 的调用是问题所在,您可以从那里进行调试。选项 2 很简单,但您不知道问题出在四、三、二还是一。随着您的软件变得越来越复杂,您的调试时间也会随之增加。

      【讨论】:

      • 但我们总是可以查看跟踪并找出它发生的位置。
      【解决方案4】:

      如果function one 中的功能需要$x,并且这是唯一使用$x 的功能,则只能在function one 中抛出异常。我假设功能二、三和四也会做其他事情(否则它们是无用的)。在这种情况下,您还应该检查这些函数中的值。如果他们还没有使用$x,他们将来可能会使用。在这种情况下,很容易忘记检查$x 的值并产生错误。

      【讨论】:

      • 函数二三和四将做其他工作,但与 $x 无关。 $x 的唯一用途是作为参数发送给父函数。
      【解决方案5】:

      另一种选择,我会知道踪迹,您可以用作

      Function One($x) {
        if(!is_int($x)) {
           throw Exception("X must be integer");
        }
        // .......... Do the Job ................
      }
      Function Two($x) {
          try
          {
              One($x);
          }
          catch(Exception $e)
          {
              throw $e;
          }
      }
      Function Three($x) {
          try
          {
               Two($x);
           }
          catch(Exception $e)
          {
              throw $e;
          }
      }
      Function Four($x) {
          try
          {
           Three($x);
           }
          catch(Exception $e)
          {
              throw $e;
          }
      
      }
      

      在这种情况下你可以知道错误从哪里开始,并且只有1个is_int检查。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多