修改条件,因为堆栈在Common Lisp中展开

时间:2015-01-12 13:06:52

标签: exception-handling common-lisp

我正在研究一些用于启动CVS存储库的lisp代码,以便将其转换为git转换的形状。因此,当出现问题时,它可能不是我的代码中的错误,但可能是输入数据中的不准确,需要修复。

在我的代码的内部深处,我将(比方说)通过采用交叉点合并两个日期范围的某些函数。如果那个交叉点变空,我会提出错误。这一切都很好,但我的“合并日期”功能缺少用户(我!)需要的大量信息,以便弄清楚出了什么问题。例如,我正在处理哪个CVS主文件(“foo,v”)?我在想什么分支?等等。

我对此问题的部分解决方案是处理并重新引发错误。例如,这种代码:

             (handler-case
                 (do-something)
               (unclear-graft-point (c)
                 (setf (slot-value c 'master) master)
                 (setf (slot-value c 'branch) branch)
                 (error c)))

在重新引发错误之前设置一些带有用信息的额外插槽。

条件的报告函数然后检查这些槽是否已设置,如果是,将使用它们来提供更有用的错误消息。

不幸的是,我得到的回溯在顶级重新加注时停止。这是有道理的:这是我写的代码。但这不是我想要的......

Common Lisp中是否有一种方法可以“注释”一个条件,因为它不会重新提升它,因此,部分展开堆栈而不报告后面的跟踪?

我提供了大量有关我正在做的事情的背景信息,希望如果不可能,有人会说“啊,在这种情况下你应该做些什么......”:我是只是走错了路?

1 个答案:

答案 0 :(得分:1)

是的,有一种适用于您的案例的Common Lisp技术 - 它被称为HANDLER-BIND。您可以在Peter Seibel的Practical Common Lisp Chapter 19. Conditions and Restarts中找到详细的解释和用例以及其他条件处理机制。