c#同时执行try和catch

本文关键字:catch try 执行 | 更新日期: 2023-09-27 18:08:31

我有一个关于c#中的try catch函数的问题。我在我的discord bot中使用它,但它同时执行这两个。所以它会执行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!");
                    }
                }
            });
}

c#同时执行try和catch

所以正如评论已经指出的那样,这是一个正确的行为。这意味着你的try块抛出了一个异常,因此程序也在处理catch块。

但有一件事是,您的消息暗示执行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);
}