发生异常时,存储函数调用及其参数的最佳方法是什么?

时间:2012-05-29 07:19:30

标签: clojure

这是Clojure: Compile time insertion of pre/post functions

的后续内容

我的目标是调用调试函数而不是抛出异常。我正在寻找存储堆栈帧,函数调用及其参数列表的最佳方法来实现此目的。

我想要一个函数(my-uber-debug),这样当我调用它时(而不是抛出异常),会发生以下情况:

  • 弹出一个新的Java窗口
  • 有当前 clojure 堆栈框架
  • 的记录
  • 对于每个堆栈帧,都有一个传递给函数
  • 的参数的记录

这样我就可以向上/向下移动堆栈帧,并检查传递的参数以获得当前点。 [如果不知何故,奇迹般地,我们可以获得在“let”环境中定义的变量,这也很棒。]

当前的想法

我将有一个线程局部变量 uber-debug ,其类型为:     StackFrames列表   其中StackFrame = function + arguments

在每个函数调用时,它将推送(将当前函数+参数包含在 uber-debug 中),然后在函数调用结束时,它将从<删除第一个元素EM>尤伯杯调试

然后,当我调用(my-uber-debug)时,它只会弹出一个新的java窗口,让我与 uber-debug 进行交互

问题

到目前为止我所拥有的想法可能不适合设置它。解决这个问题的正确方法是什么?

编辑:

问题不在于Swing / GUI部分。它是关于如何存储堆栈帧。

谢谢!

1 个答案:

答案 0 :(得分:0)

你的回答可能取决于很多因素,所以我想通过给你我的想法来回答这个问题。

如果您只想在发生异常时存储函数调用及其参数,则可以将宏或函数写为包装器来完成此操作。然后,您必须将要调用的所有函数传递给此包装器。包装器将执行try catch操作以及您需要的任何其他操作。

除了编写包装器之外,您可能还需要查看Clojure meta data,因为您运行的代码可以查看其元数据并根据该数据做出一些决策。我从未使用过元数据,但链接上的信息看起来很有希望。

最后一点想法是,通过编辑原始帖子并将信息放在那里,进一步描述你想要完成的任务可能会有所帮助。

例如,库或主程序的堆栈跟踪是什么?

至于存储所有这些信息,多线程是否需要它,或只是一个?

您可以将信息存储在程序最高级别的let绑定中,还是需要像ref那样的内容?