使用 Transcript 处理 Smalltalk 错误

Smalltalk Error handling with Transcript

假设我有以下方法:

MyClass>>addCategory: aCategory toEvent: anEvent
    | cat |
    cat := anEvent addCategory: aCategory
    ...

现在,方法 #addCategory 可以 return 一些其他对象(例如 class Foo 的东西)或抛出错误(使用 Error signal: 'message' ).

我一直在看aBlock ifError: aBlock,是这样的:

MyClass>>addCategory: aCategory toEvent: anEvent
    | cat |
    cat := [anEvent addCategory: aCategory] ifError: [ :err | Transcript show: err. ]
    ...

但我不太清楚如何处理变量 cat 之后,以获得我想要的行为。

解决此问题的一种可能方法如下:

MyClass>>addCategory: aCategory toEvent: anEvent
    | cat |
    cat := [ anEvent addCategory: aCategory] on: Error do [ :err | Transcript show: err messageText. ^nil. ]
    Transcript show: 'Category added!'.
    ^cat

此解决方案会将错误打印到 Transcript 并从方法中打印 return nil。如果没有错误,代码将继续,在 Transcript 和 return 对象上打印消息。

这可能不是最好的解决方案,但它是一种可行的方法。只要您不介意 nil 被 return 编辑以防出现错误。

这是实现相同目的的另一种方法。这个想法是将您的代码封闭起来,就好像不会失败一样,并用 on: Error

包装它
MyClass>>addCategory: aCategory toEvent: anEvent
  | cat |
  [
    cat := anEvent addCategory: aCategory.
    Transcript show: 'Category added!']
    on: Error
    do: [:err | Transcript show: err messageText].
 ^cat

请注意,在 Error 的情况下,cat 不会被分配,因此该方法将使用 nil 进行响应。另请注意,error-handler 块中不需要 ^nil

请记住,on:do: 的想法是允许您编写简单的代码,然后处理可能的错误情况,而无需将它们内联到代码的 error-free 部分。

[
 <my naive
 and clean
 lines of code>] on: Error do: [:err | oops!]

您的解决方案没问题,但是在主代码中内联了错误处理代码,这让 reader 更难理解相关代码的主要思想。