exception-handling - 尝试删除第一个对象时,如何在 Smalltalk 中捕获空的 LinkedList 异常?

标签 exception-handling linked-list smalltalk

我是 Smalltalk 的新手,试图不使用 if 语句!
在 Python 上,我会写:

try:
   element = LinkedList.remove()
except:
   element = "nil"
finally:
   return element

Smalltalk 中的等价物是什么?

最佳答案

简短的回答:

^aLinkedList remove: aLinkOrObject ifAbsent: [nil]

请注意,在 Smalltalk 中,所有支持删除元素的集合也支持 remove:ifAbsent:信息。第一个参数是要删除的元素,第二个参数是处理元素不在集合中的情况的块。

更一般地,Smalltalk 中处理异常的方式遵循以下模式:
[<Smalltalk expression>] on: Error do: [:ex | <handle ex>]

更一般地说,论点 Error可以替换为 Exception 的任何子类层次结构,这意味着您的代码将只处理某些类型的异常。

异常处理是 Smalltalk 中的一个广泛主题,因此请将此答案视为帮助您编写一些初步 Smalltalk 代码的提示。

编辑

@SeanDeNigris 的回答和评论让我意识到我的回答至少在一个方面是不完整的:我们如何确定列表的第一个元素?实际上,使用 remove:ifAbsent: 的表达式没有提及第一个参数,原始问题将其标识为第一个元素。为了完成答案,我们还必须解决这个问题。

在第一次尝试中,我们可以尝试:
^aLinkedList remove: aLinkedList first ifAbsent: [nil]

但问题是消息aLinkedList first如果列表恰好为空,则会发出错误信号。换句话说,ifAbsent:部分将无用。所以,正如肖恩所建议的,我们有两种选择。在第一个中,我们使用条件逻辑来区分列表是否为空:
^aLinkedList isEmpty
    ifTrue: [nil]
    ifFalse: [aLinkedList remove: aLinkedList first]

第二种选择是使用异常:
^[aLinkedList remove: aLinkedList first] on: Error do: [nil]

在这一点上,我们面临着哪种替代方案更好的问题。一个很好的应用标准是简单。哪个解决方案更简单?显然是第一个。错误处理是一种高级功能,它使用一些非平凡的机制。第一个解决方案依赖于基本条件逻辑。此外,如果我们事先知道如果列表为空只会发生唯一预期的错误,那么假装我们无法预测异常有什么意义呢?在这方面使用异常和on:do:是矫枉过正,我们应该在这里避免它。

关于exception-handling - 尝试删除第一个对象时,如何在 Smalltalk 中捕获空的 LinkedList 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29202817/

相关文章:

smalltalk - 在Squeak/Pharo中浏览VisualWorks代码

string - Smalltalk - 插入 TAB 字符 (Visual Works)

ruby - 是否存在适用于 Ruby 的(实验性)类浏览器?

java - eclipse 。如果未调用具有无法访问代码的方法,为什么我看不到编译错误?

c# - 异常和内存

c - 打印链表数组

c - 链表元素在第 n 个位置插入

objective-c - NSLocking 的使用是否应该始终包含在@try/@finally 中?

.net - VB.Net 用户定义异常的例子?

c - 简单链表 - 无法访问节点