diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 82850b091..4e8ef2664 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -252,7 +252,7 @@ namespace Discord.Commands private static bool IsValidCommandDefinition(MethodInfo methodInfo) { return methodInfo.IsDefined(typeof(CommandAttribute)) && - methodInfo.ReturnType == typeof(Task) && + (methodInfo.ReturnType == typeof(Task) || methodInfo.ReturnType == typeof(void)) && !methodInfo.IsStatic && !methodInfo.IsGenericMethod; } diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index d0bf25a4b..9abe6de32 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -1,13 +1,13 @@ +using Discord.Commands.Builders; using System; -using System.Linq; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.Concurrent; -using System.Threading.Tasks; -using System.Reflection; - -using Discord.Commands.Builders; using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.ExceptionServices; +using System.Threading.Tasks; namespace Discord.Commands { @@ -166,10 +166,19 @@ namespace Discord.Commands } catch (Exception ex) { - ex = new CommandException(this, context, ex); - await Module.Service._cmdLogger.ErrorAsync(ex).ConfigureAwait(false); + var originalEx = ex; + while (ex is TargetInvocationException) //Happens with void-returning commands + ex = ex.InnerException; + + var wrappedEx = new CommandException(this, context, ex); + await Module.Service._cmdLogger.ErrorAsync(wrappedEx).ConfigureAwait(false); if (Module.Service._throwOnError) - throw; + { + if (ex == originalEx) + throw; + else + ExceptionDispatchInfo.Capture(ex).Throw(); + } } await Module.Service._cmdLogger.VerboseAsync($"Executed {GetLogText(context)}").ConfigureAwait(false); }