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!");
}
}
});
}
所以正如评论已经指出的那样,这是一个正确的行为。这意味着你的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);
}