我可以使用单个catch块有多个try块

时间:2017-01-12 16:56:36

标签: c# exception try-catch

我正在制作国际象棋游戏,我只是想知道我是否可以在我的代码中删除这些空的catch块并且让同一范围内的所有try块转到单个catch块,因为我认为这开始看起来有点愚蠢和无组织。

我的代码:

for (int i = 1; i < 8; i++)
{
    try
    {
        if (board[x + i, y].Equals(blackColor))
            checkmateList.AddLast(placementBoard[x + i, y]);//Moving Right
    }
    catch
    {

    }

    try
    {
        if (board[x - i, y].Equals(blackColor))
            checkmateList.AddLast(placementBoard[x - i, y]);//Moving Left
    }
    catch
    {

    }

    try
    {
        if (board[x, y + i].Equals(blackColor))
            checkmateList.AddLast(placementBoard[x, y + i]);//Moving Down
    }
    catch
    {

    }
}

我有空的catch块,因为我得到的唯一错误是一个越界异常,因为它会离开棋盘所以我只是停止搜索并进入另一个区域,但我认为它只是看起来很愚蠢因为占多数使我的代码移动的代码由此组成。

3 个答案:

答案 0 :(得分:3)

单个try有多个catch是可能的,而我们不能使用catch多次尝试,但你可以将整个东西包含在一个带有单个catch的Try-Block中,不需要将每个语句封闭在一起尝试块。超过获得异常后继续不会是一个好习惯。尝试这样的事情:

 try
 {
    for (int i = 1; i < 8; i++)
    {

       // all conditions and statements here
    }
 }
 catch
 {
      // handle exception here
 }

在这种情况下,我们可以期待IndexOutOfRangeException,而不是等待抛出异常,我们可以简单地跳过通过条件语句获取异常的机会,在这种情况下代码应该是这样的:

for (int i = 1; i < 8; i++)
{
    if (x + i < 8 && board[x + i, y].Equals(blackColor))
        checkmateList.AddLast(placementBoard[x + i, y]); //Moving Right

    if (x - i >= 0 && board[x - i, y].Equals(blackColor))
        checkmateList.AddLast(placementBoard[x - i, y]); //Moving Left

    if (y + i < 8 && board[x, y + i].Equals(blackColor))
        checkmateList.AddLast(placementBoard[x, y + i]); //Moving Down
}

答案 1 :(得分:2)

正如其他人提到的那样,最好删除try / catches,而不是测试移动是否在棋盘上。

IAsyncAction Action = deviceClient.SendEventAsync(message);

答案 2 :(得分:1)

流量控制的例外=糟糕的主意。他们是为了发现问题而不是造成问题。

要回答原始问题,您可以嵌套try / catch块。

try{  try{ condition; } catch { response(); } catch {response2();}

现在,让我们以正确的方式做到这一点。在方法之外,让我们做:

        public enum Directions 
        {
            Right, 
            Left, 
            Down
        }

现在,让我们使用它。

for (int i = 1; i < 8; i++)
{
    bool right, left, down;
     right =  board[x + i, y].Equals(blackColor);
     left = board[x + i, y].Equals(blackColor);
     down = board[x - i,y].Equals(blackColor)    
    var direction = new List<bool>() { right, left, down }


    for(i = 0; i < direction.Count, i++) 
    {
      try    
       {  
             if(direction[i])
             {
                  switch(i)
                  {
                     case Directions.Right: checkmateList.AddLast(placementBoard[x + i, y]); break;
                     case Directions.Left: checkmateList.AddLast(placementBoard[x - i, y];); break;
                     case Directions.Down: checkmateList.AddLast(placementBoard[x, y + i]); break;
                     default:
                            throw new ApplicationException("oops");
                            break; //not needed but i prefer to keep breaks in anyway       
                  }
             }  
       } catch (Exception ex){ //do stuff; }
    }

}
不是我最漂亮的格式,但你去了。 Indeces和enums可以很好地完成好伙伴。