Discord.NET - Получить, какой тип исключения был брошен в команду - PullRequest
0 голосов
/ 01 мая 2018

Я подумал, что было бы легче генерировать исключения, если, скажем, у человека нет прав на запуск команды, или есть перезарядка, или что-то еще, вместо того, чтобы просто обрабатывать это каждый ... один ... время . Поэтому я сделал свои собственные исключения, но проблема в том, что CommandService.ExecuteAsync (). Error возвращает только CommandError.Exception, без возможности (насколько я могу судить) выяснить, какой тип исключения был выдан.

Мой код выглядит следующим образом:

try { var result = await _service.ExecuteAsync(context, argPos);

            if (!result.IsSuccess)
                switch (result.Error)
                {
                    case CommandError.BadArgCount:
                        await context.Channel.SendMessageAsync("Bad argument count.");
                        break;
                    case CommandError.UnknownCommand:
                        break;
                    case CommandError.Exception:
                        // This is what happens instead of the catch block.
                        break;
                    default:
                        await context.Channel.SendMessageAsync($"You ?? Broke ?? It ({result.ErrorReason})");
                        break;

                }
        }
        catch (Exceptions.GameCommandNotReadyException e)
        {
            // The code never gets here because of the CommandError.Exception
        }

1 Ответ

0 голосов
/ 02 мая 2018

Вы, вероятно, не хотите использовать try / catch там, поскольку вы бы без необходимости бросили свое собственное исключение, а затем перехватили его сразу после этого. Вы можете просто поместить свою обработку ошибок в case CommandError.Exception.

Если вы хотите узнать больше об исключении, которое привело к ошибке:

Поскольку вы вызываете функцию ExecuteAsync, вполне вероятно, что «результат» относится не только к типу IResult, но и к типу ExecuteResult . Это означает, что есть свойство «Исключение», в котором хранится «что пошло не так».

case CommandError.Exception:
    if (result is ExecuteResult execResult)
    {
        //you can now access execResult.Exception to see what happened
    }

break;
...