Smalltalk如何处理程序错误?

| 我是Smalltalk的新手。我已经阅读了一些有关它的文章和文档,并且对其概念的完整性感到惊讶。它提供了一些实时调试。 无论如何,对于程序错误,该错误表示该程序逻辑是错误的,并且该程序累积的所有突变均无效。为了保证完整性,应该从某个角度重新启动整个程序,并且应该回滚整个程序的状态。 Smalltalk如何处理此问题? (也许这个问题可以应用于所有动态REPL语言...)     
已邀请:
        Smalltalk使用Exception对象。我建议您阅读有关该内容的章节https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf 它是《 Pharo示例》一书的一部分:http://pharobyexample.org/ 关于变异,调试等,请注意,Smalltalk会用该语言重新定义很多内容。例如,MethodContext类。这些对象代表VM正在执行的方法上下文。因此,您可以检查它们,并像常规对象一样玩它们。与CompiledMethod相同。只是为了好玩,检查\“ pseudo \”变量\'thisContext \':) 如果您想自己回答问题,请看Debugger类。因此,您是否想知道在调试器中间重新启动方法时会发生什么?然后在Debugger中浏览方法#restart并遵循:)     
        实际上,您是在问“整个计算机如何回滚到已知状态?”,因为Smalltalk映像是与VMWare和VirtualBox相同的虚拟机。 正如他在其博士论文《使用编程语言进行实验》中所描述的,我们最能消除任意副作用(不包括回滚I / O等明显的可能性)的能力可能是亚历山德罗·沃思的世界。至少从一般意义上讲:当然可以使用Memento和Command模式之类的东西来实现不可撤消的操作。     
        我猜您指的是映像中的许多对象,这些对象在开发和调试时可能会进入不一致状态。通常的过程是将代码存储在类似(Monticello的squeak / pharo)包中。当您想重置东西时,您会从分发中获得干净的映像,并从软件包中重新加载代码。对于已部署的应用程序,除了软件包中的代码外,通常还需要一些信息来重新创建以某种外部形式存储的数据对象,例如存储在文件或dql或noSql数据库中的序列化形式。因此,您的重置过程将是获取新图像,从包中加载代码,从外部存储加载数据模型对象。     
        没有! 从小谈话中,我知道他们都不支持这种交易。设置执行期间累积的所有副作用。没有支持的自动回滚。目前正在研究如何支持此方法,但没有尝试使用AFAIK的方法。必须知道的是,如果要调试,则返回堆栈跟踪,以了解对象不在执行时的状态。您只会看到处于最新状态的对象。 虽然以通用方式支持它并不容易,但仍有一些可能性可以通过程序设计来解决。最突出的方法是: 您可以复制/克隆要修改的对象,并将更改应用于副本。如果出现问题,您只需要丢弃副本即可。如果一切正常,则将副本的内容应用于原件。您可以使用memento模式解决此问题。 您将更改应用于对象,但是如果出现问题,请重新应用原始内容。可以使用命令模式通过执行/撤消操作来实现     

要回复问题请先登录注册