我正在用C#创建一种解释性编程语言(对于lulz而言,除了获得乐趣并了解编译器之外没有其他真正的用途),并遇到了问题。在我的词法分析器中,我记得令牌在原始文件中的位置,以提供更有用的调试错误。我保留这个“TokenPosition”对象,在程序进行编译步骤时将其复制,直到它在运行解释代码的同一对象中结束(例如,我的命名变量的“Identifier”类具有TokenPosition成员)。
我的问题:如果抛出异常,我想查看堆栈,找到带有TokenPosition成员的最顶层对象,并打印其位置。或者,更一般地说,“如何在异常之后获取堆栈中的对象?这是否可能?” (我可以检查它是否有TokenPosition对象/轻松获取它,我不会问如何做到这一点)
我不想做的最后一个度假村:对行为的每一次调用(发生很多)都会使用this.tokenPosition在某处分配一个静态tokenPosition变量。我也可以通过尝试/捕获来包围一切,但同样,我真的不想这样做。
答案 0 :(得分:2)
方法的参数是短暂的。当它们不再存在时,它们可能被局部变量覆盖,或者被JIT编译器优化为未使用,甚至是垃圾收集while the method is running。您必须自己跟踪此信息,例如,为“当前活动对象”提供单独的堆栈数据结构,该结构由using
子句自动解除。