Exception handling 自动代理/代理工厂对象上的异常句柄

Exception handling 自动代理/代理工厂对象上的异常句柄,exception-handling,spring.net,aop,Exception Handling,Spring.net,Aop,我开始学习Spring.NET框架,对代理、自动代理和异常处理的行为感到非常困惑 例如,我定义了简单的业务对象,并从这个对象中抛出自定义异常 namespace Aspect.Managers { 公共接口IDbCustomerManager { 客户GetCustomerById(长id); } 公共类DbCustomerManager:IDbCustomerManager { 公共客户GetCustomerById(长id) { 抛出新的DbException(string.Format(“

我开始学习Spring.NET框架,对代理、自动代理和异常处理的行为感到非常困惑

例如,我定义了简单的业务对象,并从这个对象中抛出自定义异常

namespace Aspect.Managers
{
公共接口IDbCustomerManager
{
客户GetCustomerById(长id);
}
公共类DbCustomerManager:IDbCustomerManager
{
公共客户GetCustomerById(长id)
{
抛出新的DbException(string.Format(“问题加载Id为{0},Id为的客户”);
}
}
}
其次,我定义了处理异常的建议

公共类LogExThrowsAdvice:IthrowsDevice
{
后序公共无效(MethodInfo方法,对象[]参数,
对象目标,DbException(异常)
{
Console.WriteLine(异常消息);
}
}
最后,我使用代理将业务对象和建议连接到一起

在app.confing中

建议:


自动代理


《华尔街日报》的建议
并测试它:

var springContext=ContextRegistry.GetContext();
var dbMgr=(IDbCustomerManager)springContext[“theDbCustomerManager”];
dbMgr.GetCustomerById(1);
抛出异常,从LogExThrowsAdvice派生的方法未调用

我尝试将更改的建议类型更改为BeforeAdvice类型

public类DbAccessAdvice:IMethodBeforeAdvice
{
#iMethodBeforeDevice的区域实现
之前的公共无效(MethodInfo方法,对象[]参数,对象目标)
{
WriteLine(“您尝试访问数据库”);
}
#端区
}
在app.config中:


建议
《华尔街日报》的建议
以前的建议是火,但现在的建议不是。为什么

我尝试更改代理对象工厂的自动代理,并尝试代理接口IDbCustomerManager


建议
法律公告
var springContext=ContextRegistry.GetContext();
var dbMgr=(IDbCustomerManager)springContext[“theProxy”];
dbMgr.GetCustomerById(1);
在“建议”被解雇但“建议”没有被解雇之前?为什么?只有例外

对我来说,这真的很神奇

我试着用顾问代替建议:


但在发出通知之前的结果相同,但不会抛出通知

我也尝试过使用Spring.NET中的ExceptionHandleAdvice方面,同样的异常也会被抛出,但建议不会


关于异常名称DbException swallow
这个项目是我的魔术我上传所有VS项目在这里:

以下是异常的堆栈跟踪:

在中的Aspect.Managers.DbCustomerManager.GetCustomerById(Int64 id)处 E:\C# PROJECTS\STUDY\SPRING.NET\STUDY.SPRING.NET\Aspects\Logging\Log4Net\Managers\DbCustomerManager.cs:line 20点 _Spring.Reflection.dynamic.SafeMethod.Invoke(Object)中的dynamic_Aspect.Managers.DbCustomerManager.GetCustomerById(Object,Object[]) 目标,对象[]参数)位于 位于的Spring.Aop.Framework.DynamicMethodInvocation.InvokeJoinpoint() 位于的Spring.Aop.Framework.AbstractMethodInvocation.Procedure() Spring.Aspects.Exceptions.ExceptionHandlerAdvice.Invoke(IMethodInvoke 调用)

另外,如果我尝试捕获类似以下内容的异常:

试试看
{
var springContext=ContextRegistry.GetContext();
var dbMgr=(IDbCustomerManager)springContext[“theDbCustomerManager”];
dbMgr.GetCustomerById(1);
}
捕获(例外情况除外)
{
WriteLine(“{0}\n{1}”,例如GetType(),例如Message);
}

不可能..系统显示消息未处理异常..

我测试了您的包。一切正常(我使用的是v1.3.2)。 异常被
posthrows
通知捕获(使用断点),但不会被忽略。 这是我的配置:

public-void-afterhrowing(MethodInfo-method,Object[]args,
对象目标,DbException(异常)
{
Console.WriteLine(异常消息);
}

法律公告

如果你把你的代码和bbaia的配置结合起来,我想你已经成功了一半

从您的问题和评论中,我了解到您想要吞下
DbException
s。 请注意,一般来说,您永远不会希望日志记录器出现异常,但为了回答这个问题,请假设您需要异常,但请向我保证,您永远不会在生产环境中这样做:-)

我建议您稍微调整一下您的
LogExThrowsAdvice

公共类LogExThrowsAdvice:Spring.Aspects.Exceptions.exception HandlerAdvice,IThrowsDevice
{
后序公共无效(MethodInfo方法,对象[]参数,
对象目标,异常)
{
Console.WriteLine(异常消息);
}
}
继承ExceptionHandlerAdvice
允许您指定,例如将其吞下。 然后获取bbaia的配置并向其添加事件处理程序:


关于异常名称DbException swallow
现在所有的
DbException
s都被吞没了

关于你的问题,关于这在VisualStudio中是如何抛出的:你的VS是否设置为“在抛出异常时中断”?转到Debug->Exceptions并选中公共语言运行时异常的抛出复选框


请注意,如果选中此选项,则在引发异常时仍可继续:程序不会崩溃,因为异常已被处理。

@Marjin。如果我在VS ex中运行应用程序