调试异步代码中的异常

Dus*_*tin 5 .net c# asp.net async-await asp.net-web-api

回到我在使用ASP.NET MVC 3的代码中使用同步方法时,如果抛出异常,在我的异常过滤器中找出它的位置并不难.只看堆栈跟踪就足够了.

async但是,当ASP.NET Web API中的方法抛出异常时,异常详细信息不太有用,因为堆栈跟踪不会显示抛出异常的位置:

System.ArgumentException: title must not be empty.
Parameter name: title    
at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__1.MoveNext()
Run Code Online (Sandbox Code Playgroud)

目前,我必须查看此消息的所有异常,并根据请求URI以及幕后发生的情况猜测哪一个被抛出,或者尝试使用附加的调试器在本地重现错误.

MSDN有一篇文章,详细介绍了一些获取伤亡链的策略:http://msdn.microsoft.com/en-us/magazine/jj891052.aspx3.根据我的理解,我有两个选择:

  • 使用System.Diagnostics.EventListener并在运行时获得性能命中
  • 创建一个扩展方法,并在每次await调用时使用它

是否有更好的方法来记录有关引发此异常的更多有用详细信息?拥有伤亡链会很好,但只是获得异常来源会很好(这是什么类型和方法).

Ben*_*ams 2

针对 .NET 4.5.1 而不是 4.5 进行编译,您通常会通过异步获得更好的异常跟踪。