diff --git a/Tapeti/Default/ControllerMethodBinding.cs b/Tapeti/Default/ControllerMethodBinding.cs index 66fe846..bedb7cd 100644 --- a/Tapeti/Default/ControllerMethodBinding.cs +++ b/Tapeti/Default/ControllerMethodBinding.cs @@ -211,7 +211,7 @@ namespace Tapeti.Default private delegate Task MessageHandlerFunc(IControllerMessageContext context); - private static MessageHandlerFunc WrapMethod(MethodInfo method, IEnumerable parameterFactories, ResultHandler resultHandler) + private MessageHandlerFunc WrapMethod(MethodInfo method, IEnumerable parameterFactories, ResultHandler resultHandler) { if (resultHandler != null) return WrapResultHandlerMethod(method, parameterFactories, resultHandler); @@ -229,49 +229,98 @@ namespace Tapeti.Default } - private static MessageHandlerFunc WrapResultHandlerMethod(MethodBase method, IEnumerable parameterFactories, ResultHandler resultHandler) + private MessageHandlerFunc WrapResultHandlerMethod(MethodBase method, IEnumerable parameterFactories, ResultHandler resultHandler) { return context => { - var result = method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); - return resultHandler(context, result); + try + { + var result = method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); + return resultHandler(context, result); + } + catch (Exception e) + { + AddExceptionData(e); + throw; + } }; } - private static MessageHandlerFunc WrapNullMethod(MethodBase method, IEnumerable parameterFactories) + private MessageHandlerFunc WrapNullMethod(MethodBase method, IEnumerable parameterFactories) { return context => { - method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); - return Task.CompletedTask; + try + { + method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); + return Task.CompletedTask; + } + catch (Exception e) + { + AddExceptionData(e); + throw; + } }; } - private static MessageHandlerFunc WrapTaskMethod(MethodBase method, IEnumerable parameterFactories) - { - return context => (Task)method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); - } - - - private static MessageHandlerFunc WrapGenericTaskMethod(MethodBase method, IEnumerable parameterFactories) + private MessageHandlerFunc WrapTaskMethod(MethodBase method, IEnumerable parameterFactories) { return context => { - return (Task)method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); + try + { + return (Task) method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); + } + catch (Exception e) + { + AddExceptionData(e); + throw; + } }; } - private static MessageHandlerFunc WrapObjectMethod(MethodBase method, IEnumerable parameterFactories) + private MessageHandlerFunc WrapGenericTaskMethod(MethodBase method, IEnumerable parameterFactories) { return context => { - return Task.FromResult(method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray())); + try + { + return (Task)method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray()); + } + catch (Exception e) + { + AddExceptionData(e); + throw; + } }; } + private MessageHandlerFunc WrapObjectMethod(MethodBase method, IEnumerable parameterFactories) + { + return context => + { + try + { + return Task.FromResult(method.Invoke(context.Controller, parameterFactories.Select(p => p(context)).ToArray())); + } + catch (Exception e) + { + AddExceptionData(e); + throw; + } + }; + } + + + private void AddExceptionData(Exception exception) + { + exception.Data["Tapeti.Controller.Name"] = bindingInfo.ControllerType?.FullName; + exception.Data["Tapeti.Controller.Method"] = bindingInfo.Method?.Name; + } + /// /// Contains information about the queue linked to the controller method.