簡體   English   中英

我可以將多個try塊與一個catch塊一起使用嗎

[英]Can I have multiple try blocks with a single catch block

我正在做一個國際象棋游戲,我只是想知道我是否可以擺脫代碼中這些空的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塊,因為我得到的唯一錯誤是超出范圍的異常,因為它將超出范圍,所以我只是停止了搜索並進入了另一個區域,但是我認為它看起來很愚蠢,因為我的大部分代碼這使得棋子移動了。

可以使用多次捕獲進行單次try ,而我們不能使用一次以上的捕獲,但是您可以將整個事件包含在具有單個捕獲的Try-Block中,而不必將每個語句都封裝在單獨的try塊中。 超過異常后繼續下去並不是一個好習慣 嘗試這樣的事情:

 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
}

正如其他人所提到的,最好刪除try / catches,然后測試是否在棋盤上。

for (int i = 1; i < 8; i++)
{
    if (x + i < board.GetLength(0) && 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 < board.GetLength(1) && board[x, y + i].Equals(blackColor))
        checkmateList.AddLast(placementBoard[x, y + i]); //Moving Down
}

流量控制的例外=壞主意。 它們是為了發現問題,而不是引起問題。

要回答原始問題,您可以嵌套您的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和enum可以使好朋友做好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM