我对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!");
}
}
});
}
答案 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);
}