2016-09-22 33 views
-1

我有一個關於C#中的try catch函數的問題。我在我的不和機器人中使用它,但它執行兩個。所以它會做嘗試和捕獲。爲什麼是這樣?我寫錯了什麼或錯過了一些小東西?C#執行try和catch

代碼:

private void RegisterKickCommand() 
{ 
    commands.CreateCommand("kick") 
     .Parameter("a", ParameterType.Unparsed) 
      .Alias(new string[] { "k" }) //add alias 
      .AddCheck((cm, u, ch) => u.ServerPermissions.KickMembers) 
      .Do(async (e) => 
      { 
       await e.Channel.SendMessage(e.GetArg("a")); 
       if (e.Message.MentionedUsers.FirstOrDefault() == null) 
       { 
        await e.Channel.SendMessage(e.User.Mention + " That's not a valid user!"); 
       } 
       else 
       { 
        try 
        { 
         await e.Message.MentionedUsers.FirstOrDefault().Kick(); 
         await e.Channel.SendMessage(e.GetArg("Kick") + " was kicked!"); 
        } 
        catch 
        { 
         await e.Channel.SendMessage(e.User.Mention + " I do not have permission to kick that user!"); 
        } 
       } 
      }); 
} 
+14

嘛,當然! 'try'中的代碼將執行,直到遇到異常,此時它將開始執行'catch'。 – Kroltan

+1

你應該讀一點關於try-catch的內容。 https://msdn.microsoft.com/en-us/library/0D565esw.aspx – kiziu

+0

這就是try/catch的工作方式。 :) –

回答

1

因此,作爲評論已經指出,這是一個正確的行爲。這意味着您的try塊會拋出異常,因此程序也在處理catch塊。

但有一件事是,您的消息暗示catch執行的唯一原因是缺少權限。這聽起來像是預料之中的事情,在程序的邏輯中是可能的。在這種情況下,代替try catch塊最好使用像if這樣的流量控制,例如,

if(e.Message.MentionedUsers.FirstOrDefault().HasKickPermission()) 
{ 
    // process kick 
} 
else 
{ 
    // show message the processing is not allowed 
} 

try catch的作用是處理意外的事情。像例如NullReferenceException(這看起來可能實際上是您的代碼中的情況,因爲此位e.Message.MentionedUsers.FirstOrDefault()可以返回null)。

此外,爲了更好地處理異常情況,你應該捕捉異常的實例,並相應地處理它,這樣的:

try 
{ 
    // your code 
} 
catch(Exception ex) 
{ 
    // Handle the error. E.g. Log it or display a message to the user. 
    await e.Channel.SendMessage("Unexpected exception: " + ex.Message); 
}