例如...

if ( /* Condition */ ) {

    if ( /* Condition */ ) {

        if ( /* Condition */ ) {

          // Superb!

        } else {

          // Error 3

        }

    } else {

      // Error 2

    }

} else {

  // Error 1

}

你知道如何避免这种情况吗?谢谢你!

有帮助吗?

解决方案

如果这是一个库函数, throw 可能是适当的行动。

if (!condition1) {
    throw "Condition 1 failed.";
}

if (!condition2) {
    throw "Condition 2 failed.";
}

if (!condition3) {
    throw "Condition 3 failed.";
}

// Superb!

其他可接受的行动可能是:

  • 返回 0, null, , 或者 undefined.
  • 向用户显示错误并返回。

您必须确定哪种故障操作适合您的用例。

其他提示

它看起来像您有3个条件,以检查和4点的动作(3个不同的误差+ 1次成功)。不幸的是在一般情况下,这将需要3个条件检查和4分的动作。我认为该代码可以通过使用下面的结构虽然被清洁了位

if (! /* condition 1 */ ) {
  // Error 1
} else if (! /* condition 2 */ ) { 
  // Error 2
} else if (! /* condition 3 */ ) { 
  // Error 3
} else {
  // superb
}

那么你可以一个块,或者多个函数内使用的异常,或断裂。通常,这需要你的反转条件,以获得代码订购的正确途径。

do {
    if (! /* Condition 1 */ ) {
        // Error 1
        break;
    }

    if (! /* Condition 2 */ ) {
        // Error 2
        break;
    }

    if (! /* Condition 3 */ ) {
        // Error 3
        break;
    }

    // Superb!
} while (false);

在做,而(假)环是制作块,你可以在不会容忍一个匿名块语言打破了的一种方式。它可以很容易地成为一个功能和使用收益,或一个try-catch例外。

你会更喜欢这个?

if ( /* Condition 1*/ && /* Condition 2*/ && /* Condition 3 */) {
  // Superb!
}
else if (! /* Condition 1*/){
  // Error 1
}
else if (! /* Condition 2*/){
  // Error 2
}
else if (! /* Condition 3*/){
  // Error 3
}
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}

if (! condition 2){
Error 2
throw someSortOfOtherException
}

if (! condition 3){
Error 3
throw another Exception
}

// Success!

根据不同的情况,你的代码可能会被优先。你可能会想某个地方赶那些例外的例子。

if (!condition1)
    // Error 1 (and exit scope if necessary)

if (!condition2)
    // Error 2 (and exit scope if necessary)

if (!condition3)
    // Error 3 (and exit scope if necessary)

// Superb!

是;您可以将您if语句组合到一起使用AND运算一个复合语句,并在单块处理错误条件。根据你的错误处理的需求,不过,你可能需要再次有多个ifs以确保你正确地处理错误(这取决于你的错误处理的分辨率,真的)。

要即:

if (CondA && CondB && CondC)
   {
   // Execute success
   }
else
   {
   if (!CondA)
      // Do error A
   else if (!CondB)
      // Do error B
   else if (!CondC)
     // Do error C
   }
}

有几种方法,最简单的就是简单地出局了一些功能和抽象出来的不同层(如果你发现自己去深这本来也应该做。)

if ( /* Condition */ ) {
    value = aFunctionSaysWhat();
} else {
  // value = Error 1
}

....
value aFunctionSaysWhat(){
    if ( /* Condition */ ) {
         return aSecondFunctionHere();
    } else {
      // return Error 2
    }
}

的基本前提是,函数应该住抽象如果可能的一个层上,并做一两件事。

下一个可能性是将其压平的所有出来,这是优于初始嵌套的方法,但基本上具有类似的复杂性。这可能是更清洁的比功能的方法,如果你只有几个选项,你不打算增加更多。

if(ErrorCondition1){
   //Error 1
}else if(ErrorCondition2){
   //Error 2
}else if(ErrorCondition3){
   //Error 3
}else{
   //Superb
}

最后,您还可以存储散列或地图所需的答案,并删除如果完全实现这依赖于你的能力哈希一些结果的能力:

Results = {'Result1':'Error1', 'Result2':'Error2', 'Result3':'Error3', 'Success':'Superb'}

return Results[ConditionHash(Condition)];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top