gpt4 book ai didi

c# - 异常堆栈跟踪不显示抛出异常的位置

转载 作者:太空狗 更新时间:2023-10-29 18:01:27 24 4
gpt4 key购买 nike

通常,当我抛出一个异常、捕获它并打印出堆栈跟踪时,我会看到抛出异常的调用、导致异常的调用、导致那个,依此类推回到整个程序的根。

现在它只向我显示异常被捕获 的调用,而不是异常被抛出 的调用。我不知道发生了什么变化导致了这一点。这是我的程序:

using System;

class foo {
static void Main(string[] args) {
try { f(); }
catch (Exception e) { Console.WriteLine(e.StackTrace); }
}
static void f() { g(); }
static void g() { throw new Exception(); }
}

下面是打印出来的内容:

at foo.Main(String[] args) in C:\Projects\test\root.cs:line 5

我期望的是这样的:

at foo.g...
at foo.f...
at foo.Main...

有什么想法吗?

最佳答案

我将借此机会再次声明——就像我经常做的那样——堆栈跟踪不会告诉您调用了哪些方法来到达异常点被抛出。同样,调试器中的堆栈窗口不会告诉您哪些方法调用了当前方法

相反,在这两种情况下,堆栈跟踪都会告诉您控制下一步要去哪里,或者,在异常情况下,很明显,控制去哪里接下来没有异常(exception)。堆栈跟踪是一个延续;它是一种描述程序 future 执行的数据结构。它不一定描述过去。

事实上,“你下一步要去哪里”几乎总是与“我来自哪里”是一回事,这使得堆栈跟踪成为目前有用的调试工具。但是,如果运行时可以安全地消除该信息而不会弄乱“我下一步需要去哪里”信息,则堆栈跟踪不需要包含任何有关“我来自哪里”的信息。在某些情况下,运行时可以并且确实会消除该信息。 您不能依赖堆栈跟踪告诉您您来自哪里,只能告诉您下一步要去哪里。

在下一版本的 C# 和 VB 中,“async/await”只会加剧这种情况;在异步方法通过延续传递样式实现的世界中,不需要堆栈作为延续,因为延续以委托(delegate)的形式存储在堆上。在这个世界上,堆栈跟踪几乎永远不会告诉您“我从哪里来?”

关于c# - 异常堆栈跟踪不显示抛出异常的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com