C#执行try和catch

时间:2016-09-22 13:57:27

标签: c# bots

我对C#中的try catch函数有疑问。我在我的discord bot中使用它,但它同时执行。所以它会尝试和抓住。为什么是这样?我写错了什么或错过了一件小事吗?

代码:

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!");
                    }
                }
            });
}

1 个答案:

答案 0 :(得分: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);
}