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.根据我的理解,我有两个选择:
await调用时使用它是否有更好的方法来记录有关引发此异常的更多有用详细信息?拥有伤亡链会很好,但只是获得异常来源会很好(这是什么类型和方法).