关于异常处理的良好编程实践

时间:2011-04-05 10:53:26

标签: php exception

考虑函数层次结构,函数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);
  }
}

如果我使用String值调用4,则会导致出现异常。

现在考虑在父函数中使用Exception跟随代码。

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()并传递一个字符串,它也会导致异常发生。

哪一个是最佳实践,为什么?
当我开始编写代码时,我最终编写了大量的异常处理,PLZ帮助。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

另一种选择,我会知道跟踪,你可以使用

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检查。

答案 3 :(得分:0)

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

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

我不确定引擎如何评估函数处理,但大多数情况下它会将其内容推送到堆栈然后进行必要的跳转,这反过来会导致延迟,因此最好将异常处理纳入其中,生成值时,而不是让它无用地流动,直到它被用来保存无用的处理时间。

通常,异常意味着您有浪费的计算。因此,模型1将确保您不这样做。

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

答案 4 :(得分:-1)

转到here,您可以找到答案: