【发布时间】:2014-01-08 18:42:42
【问题描述】:
当我在使用 ASP.NET MVC 3 的代码中使用同步方法时,如果抛出异常,不难在我的异常过滤器中找出它来自哪里。只需查看堆栈跟踪就足够了。
但是,当 ASP.NET Web API 中的 async 方法引发异常时,异常详细信息的用处不大,因为堆栈跟踪不会显示异常是从哪里引发的:
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()
目前,我必须查看此消息的所有异常,并根据请求 URI 猜测引发了哪些异常以及幕后发生的情况,或者尝试使用附加的调试器在本地重现错误。
MSDN 有一篇文章详细介绍了获得伤亡链的几种策略:http://msdn.microsoft.com/en-us/magazine/jj891052.aspx3。根据我的理解,我有两个选择:
- 使用 System.Diagnostics.EventListener 并在运行时降低性能
- 创建一个扩展方法并将其用于每个
await调用
是否有更好的方法来记录有关引发此异常的更多有用详细信息?拥有伤亡链会很好,但只要获取异常源就可以了(这是抛出的类型和方法)。
【问题讨论】:
-
仅供参考...我们在 5.0 后进行了改进,其中保留了堆栈跟踪,您可以获得更好的详细信息..
-
@KiranChalla 太棒了!期待这方面的改进。
标签: c# asp.net .net asp.net-web-api async-await