我可以在使用统一 IOC 时抑制拦截方法中的异常吗?
Can i suppress exceptions in the intercepted method while using unity IOC?
我们想删除应用程序中多余的 try catch 块。
显然,一个统一的拦截器可以实现一个通用的处理程序并节省大量重复代码。
但是我还没有找到抑制拦截方法中异常的方法
当前:
void InterceptedMethod
{
try
{
}
catch()
{
}
}
意向:
void InterceptedMethod
{
//no try catch blocks
}
例如
(使用 StreamReader sr= new StreamReader(一些无效路径))
将在拦截方法中抛出异常,如果我删除现有的 try catch 块将不会被捕获。
(result.Exception != null) 之后的代码执行成功。
但目前只服务于"before enter"和"after exit"场景。
我仍然需要删除拦截方法中的 try catch 块。
我知道 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;
}
在上面的例子中,如果方法调用 return 是一个异常,它被设置为 null,这会导致异常被吞没。
容器可以这样配置:
var container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<ITenantStore, TenantStore>(
new InterceptionBehavior<SuppressExceptionBehavior>(),
new Interceptor<InterfaceInterceptor>());
这适用于您提到的简单方法:void InterceptedMethod() { }
。但是,对于一般情况,您必须分析预期的 return 值以确保可以 return 编辑正确的类型(否则将引发异常)。
例如,如果方法有一个 return 值怎么办?现在您必须将 result.ReturnValue
对象设置为与预期的 return 类型兼容的值(或使用具有有效值的 input.CreateMethodReturn() )。对于引用类型,这可以为 null,因此应该无需任何更改即可工作,但对于值类型(例如 int),需要设置特定值。另一个需要处理(以避免抛出异常)的示例是为输出参数设置默认值。
我们想删除应用程序中多余的 try catch 块。
显然,一个统一的拦截器可以实现一个通用的处理程序并节省大量重复代码。
但是我还没有找到抑制拦截方法中异常的方法
当前:
void InterceptedMethod
{
try
{
}
catch()
{
}
}
意向:
void InterceptedMethod
{
//no try catch blocks
}
例如 (使用 StreamReader sr= new StreamReader(一些无效路径)) 将在拦截方法中抛出异常,如果我删除现有的 try catch 块将不会被捕获。
(result.Exception != null) 之后的代码执行成功。
但目前只服务于"before enter"和"after exit"场景。
我仍然需要删除拦截方法中的 try catch 块。 我知道 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;
}
在上面的例子中,如果方法调用 return 是一个异常,它被设置为 null,这会导致异常被吞没。
容器可以这样配置:
var container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<ITenantStore, TenantStore>(
new InterceptionBehavior<SuppressExceptionBehavior>(),
new Interceptor<InterfaceInterceptor>());
这适用于您提到的简单方法:void InterceptedMethod() { }
。但是,对于一般情况,您必须分析预期的 return 值以确保可以 return 编辑正确的类型(否则将引发异常)。
例如,如果方法有一个 return 值怎么办?现在您必须将 result.ReturnValue
对象设置为与预期的 return 类型兼容的值(或使用具有有效值的 input.CreateMethodReturn() )。对于引用类型,这可以为 null,因此应该无需任何更改即可工作,但对于值类型(例如 int),需要设置特定值。另一个需要处理(以避免抛出异常)的示例是为输出参数设置默认值。