考虑函数层次结构,函数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帮助。
答案 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,您可以找到答案: