Exception handling 自动代理/代理工厂对象上的异常句柄
我开始学习Spring.NET框架,对代理、自动代理和异常处理的行为感到非常困惑 例如,我定义了简单的业务对象,并从这个对象中抛出自定义异常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(“
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中运行应用程序