gpt4 book ai didi

c# - 我可以在使用统一 IOC 时抑制拦截方法中的异常吗?

转载 作者:行者123 更新时间:2023-11-30 18:17:04 25 4
gpt4 key购买 nike

我们想删除应用程序中多余的 try catch block 。

显然,一个统一的拦截器可以实现一个通用的处理程序并节省大量重复代码。

但是我还没有找到在拦截方法中抑制异常的方法。

电流:

void InterceptedMethod
{
try
{
}
catch()
{
}
}

目的:

void InterceptedMethod
{
//no try catch blocks

}

例如 (使用 StreamReader sr= new StreamReader(一些无效路径))将在拦截方法中抛出异常,如果我删除现有的 try catch block ,则不会捕获该异常。

(result.Exception != null) 之后的代码执行成功。

但目前只服务于“进入前”和“退出后”场景。

我仍然需要删除拦截方法中的 try catch block 。我知道 postsharp 或 caSTLe windsor 允许我们设置属性。

unity IOC有什么方法?

最佳答案

对于简单的情况,创建一个将吞噬异常的 IInterceptionBehavior 是相对直接的。例如:

public class SuppressExceptionBehavior : IInterceptionBehavior
{
public IEnumerable<Type> GetRequiredInterfaces() => new Type[0];

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
IMethodReturn result = getNext()(input, getNext);
if (result.Exception != null)
{
result.Exception = null;
}

return result;
}

public bool WillExecute => true;
}

在上面的示例中,如果方法调用返回异常,则将其设置为 null,从而导致异常被吞没。

容器可以这样配置:

var container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<ITenantStore, TenantStore>(
new InterceptionBehavior<SuppressExceptionBehavior>(),
new Interceptor<InterfaceInterceptor>());

这适用于您提到的简单方法:void InterceptedMethod() { }。但是,对于一般情况,您必须分析预期的返回值以确保可以返回正确的类型(否则将引发异常)。

比如方法有返回值怎么办?现在您必须将 result.ReturnValue 对象设置为与预期返回类型兼容的值(或使用具有有效值的 input.CreateMethodReturn())。对于引用类型,这可以为 null,因此应该无需任何更改即可工作,但对于值类型(例如 int),需要设置特定值。另一个需要处理(以避免抛出异常)的示例是为输出参数设置默认值。

关于c# - 我可以在使用统一 IOC 时抑制拦截方法中的异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45092436/

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