2011-06-13 68 views
4

我是Smalltalk的新手。我已经阅读了一些关于它的文章和文件,我对它的概念完整性感到惊讶。它提供了一些实时调试。Smalltalk如何处理程序错误?

无论如何,对于程序错误,错误意味着程序逻辑错误,程序中累积的所有变化都是无效的。为了保证完整性,整个程序应该从某个点重新启动,整个程序状态应该是回滚的。

Smalltalk如何处理这个问题? (也许这个问题可以应用于所有动态REPL语言......)

回答

5

Smalltalk使用Exception对象。我建议你阅读有关https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf

它是菲罗按例本书的部分章节:http://pharobyexample.org/

关于突变,调试等,注意Smalltalk的具体化的东西很多的语言。例如,MethodContext类。这些对象表示VM正在执行的方法上下文。所以你可以检查它们,并像普通物体一样和它们一起玩。与CompiledMethod相同。只是为了好玩,检查“伪”变量'thisContext':)

如果你想自己回答你的答案,请看一下Debugger类。那么,您是否想知道在调试器中重新启动该方法时会发生什么?然后浏览方法#restart在调试器,并按照:)

2

你问,实际上,“这怎么能整个计算机回滚到已知状态?”,因为Smalltalk的形象是一个虚拟机中和VMWare和VirtualBox一样。

,我们必须撤消任意副作用的能力,最近(不包括明显的不可能性就像回滚I/O)可能是亚历山德罗沃斯的世界,在他的博士论文中描述Experimenting with Programming Languages。至少在一般意义上说:当然可以使用诸如Memento和Command模式之类的东西来实现可撤销操作。

1

我想你指的是图像中的很多对象,在开发和调试时可能会进入不一致的状态。通常的程序是将代码存储在软件包中,例如(Monticello for squeak/pharo)。当你想要重置的东西时,你会从发行版中获得一个干净的映像,并从包中重新加载代码。除了包中的代码外,对于已部署的应用程序,通常还需要重新创建以某种外部形式(如存储在文件中的序列化表单或dql或noSql数据库中)存储的数据对象的信息。因此,您的重置过程将采取新的形象,从包中加载代码,从外部存储加载您的数据模型对象。

1

它不!

从smalltalks我知道他们都不支持这种交易。执行过程中累积的所有副作用都已设置。没有支持的自动回滚。有研究正在进行如何支持,但没有什么可以尝试AFAIK。这是你必须知道的,如果你正在调试,并且你回到堆栈跟踪中,那么这些对象不处于执行时的状态。你只能看到处于最新状态的物体。

尽管以通用的方式支持这种方法并不容易,但有一些可能性可以通过程序的设计来解决。最突出的方法是:

  • 您复制/克隆要修改的对象并将更改应用到副本。如果出现问题,您只需丢弃副本。如果一切正常,则将副本的内容应用于原件。你可以使用纪念图案来解决这个问题。
  • 您将更改应用于对象,但如果出现问题,请重新应用原始内容。这可以通过使用命令模式的执行/撤消操作来实现