0

我正在用 C# 创建一种解释性编程语言(有点像 lulz,除了玩得开心和了解编译器之外没有真正的目的),但遇到了问题。在我的词法分析器中,我记得令牌在原始文件中的位置,以提供更有用的调试错误。我保留这个“TokenPosition”对象,在程序通过编译步骤时将其复制,直到它结束在运行解释代码的同一个对象中(例如,我的命名变量的“标识符”类有一个 TokenPosition 成员)。

我的问题:如果抛出异常,我想查看堆栈,找到具有 TokenPosition 成员的最顶层对象,并打印其位置。或者,更一般地说,“我如何在异常发生后获取堆栈中的对象?这甚至可能吗?” (我可以检查它是否有一个 TokenPosition 对象/很容易得到它,我不是在问怎么做)

我不想做的最后手段:每次调用行为(经常发生)都会在 this.tokenPosition 的某处分配一个静态 tokenPosition 变量。我也可以用 try/catchs 包围一切,但同样,我真的不想这样做。

4

1 回答 1

2

方法的参数是短暂的。当它们不再存在时,它们可能被局部变量覆盖,或者被 JIT 编译器优化为未使用,甚至在方法运行时被垃圾收集。您必须自己跟踪此信息,例如,通过为“当前活动对象”提供一个单独的堆栈数据结构,该结构会自动由using子句展开。

于 2012-08-07T13:56:16.157 回答