ASP.NET Core栈追踪中`--- End of stack trace...`注释成因咨询
关于ASP.NET Core栈追踪中
--- End of stack trace from previous location ---的解释 这行注释的出现不一定是因为代码里显式调用了ExceptionDispatchInfo.Capture(e).Throw();,更大的可能是异步代码的隐式处理导致的,和ASP.NET Core的异步编程模型直接相关:
- 异步方法(
async/await)的状态机特性:当你在异步方法里抛出异常,CLR生成的异步状态机代码会自动用ExceptionDispatchInfo捕获异常,等到await恢复时再重抛,以此保留原始的调用栈上下文。哪怕你代码里写的是普通的throw,底层还是会走这个逻辑,所以栈追踪里会自动加上那行分隔注释。 - ASP.NET Core的异步管道:从中间件到控制器方法,绝大多数核心逻辑都是异步实现的。异常在异步调用链中传递时,每经过一次
await的上下文切换,就会触发一次这种隐式的重抛操作,所以你会反复看到那行注释。
举个简单的验证例子:
async Task ThrowAsync() { throw new InvalidOperationException("Test"); } async Task Caller() { await ThrowAsync(); } try { await Caller(); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); }
运行这段代码,你会发现栈追踪里同样会出现--- End of stack trace from previous location ---,完全不需要显式调用ExceptionDispatchInfo——这是CLR处理异步异常的默认行为,和ASP.NET Core源码里有没有显式写无关。
内容的提问来源于stack exchange,提问作者ThomasArdal
相关产品推荐
相关产品推荐

