gpt4 book ai didi

.net - 在 Unity 中调用站点拦截方法的完整堆栈跟踪

转载 作者:行者123 更新时间:2023-12-04 21:21:13 31 4
gpt4 key购买 nike

我们正在研究使用 Unity 来处理拦截的日志服务方法。然而,一个问题是在调用站点上没有完整的堆栈跟踪;它仅在拦截器调用中可用。

这是一个示例设置:

public interface IExceptionService
{
void ThrowEx();
}

public class ExceptionService : IExceptionService
{
public void ThrowEx()
{
throw new NotImplementedException();
}
}

public class DummyInterceptor : IInterceptionBehavior
{
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
IMethodReturn ret = getNext()(input, getNext);
if (ret.Exception != null)
Console.WriteLine("Interceptor: " + ret.Exception.StackTrace + "\r\n");
return ret;
}

public bool WillExecute
{
get { return true; }
}
}

class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();

container.RegisterType<IExceptionService, ExceptionService>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<DummyInterceptor>());

try
{
container.Resolve<IExceptionService>().ThrowEx();
}
catch (Exception e)
{
Console.WriteLine("Call Site: " + e.StackTrace);
}

}
}

这是运行该程序的控制台输出:
Interceptor:
at ConsoleDemo.ExceptionService.ThrowEx() in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 25
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.<ThrowEx_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)

Call Site:
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.ThrowEx()
at ConsoleDemo.Program.Main(String[] args) in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 63

拦截器中的堆栈跟踪很好,足以在服务级别进行日志记录。然而,我们失去了在调用站点拦截代理调用之后的一切;

我可以将拦截器中的异常包装在 ServiceException 或类似的东西中,这将使调用堆栈保持在内部异常中,但这会导致尴尬的日志记录和调试检查场景(尽管没有完全丢失跟踪那么尴尬)。

我还注意到,当我们使用 TransparentProxyInterceptor 时,我们或多或少地得到了我们想要的东西,但这比 InterfaceInterception 慢,并且会触发某些组的警报。

是否有任何更简洁的方法可以在代理的调用站点上通过 Unity 拦截获得完整的堆栈跟踪?

最佳答案

在 .NET 4.5 中会有 ExceptionDispatchInfo以此目的。

对于所有其他版本,您可以看到这个问题:
In C#, how can I rethrow InnerException without losing stack trace?

关于.net - 在 Unity 中调用站点拦截方法的完整堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11764951/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com