我使用的是PostSharp 4.0的试用版终极版,但这对我不起作用。你能查一下我的代码并提出建议吗。该错误未被记录。如果我把断点没有点击onException方法
这是我为错误处理方面编写的代码
[Serializable]
public class MyMethodAspectAttribute : OnMethodBoundaryAspect
{
public MyMethodAspectAttribute()
{
this.ApplyToStateMachine = true;
}
public override void OnEntry(MethodExecutionArgs args)
{
Console.Write("Method Entry");
}
public override void OnException(MethodExecutionArgs args)
{
Console.Write(args.Exception.Message);
args.ReturnValue = null;
args.FlowBehavior = FlowBehavior.Return;
}
}
这是我实施此方面的课程
public class ErrorMethods
{
[MyMethodAspect]
public Task<int> Calculate(int i, int j)
{
var task = Task.Factory.StartNew(
() => i / j);
return task;
}
}
这就是我使用此方法的方式
private async void Button_Click(object sender, RoutedEventArgs e)
{
var obj = new ErrorMethods();
var result = await obj.Calculate(1, 0);
if (null == result)
{
MessageBox.Show("error");
}
}
答案 0 :(得分:0)
示例中的Calculate
方法不是异步方法,因此设置ApplyToStateMachine
aspect的属性对此方法没有影响。当新创建的任务在后台执行且方面无法捕获它时,抛出异常。
如果将Calculate
方法更改为异步方法,则方面可以拦截异步状态机执行,并在异常时调用OnException
处理程序。
请注意,设置ReturnValue
和FlowBehavior
不会改变状态机的流量,因此不会吞下异常。
public class ErrorMethods
{
[MyMethodAspect]
public async Task<int> Calculate( int i, int j )
{
return await Task.Factory.StartNew( () => i / j );
}
}