使用 Transcript 处理 Smalltalk 错误
Smalltalk Error handling with Transcript
假设我有以下方法:
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
cat := anEvent addCategory: aCategory
...
现在,方法 #addCategory
可以 return 一些其他对象(例如 class Foo
的东西)或抛出错误(使用 Error signal: 'message'
).
- 如果出现错误,我想在成绩单上打印错误信息。
- 如果是对象,我想在成绩单上打印一些消息(例如
Transcript show: 'Category added!'
)和 return 对象。
我一直在看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 更难理解相关代码的主要思想。
假设我有以下方法:
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
cat := anEvent addCategory: aCategory
...
现在,方法 #addCategory
可以 return 一些其他对象(例如 class Foo
的东西)或抛出错误(使用 Error signal: 'message'
).
- 如果出现错误,我想在成绩单上打印错误信息。
- 如果是对象,我想在成绩单上打印一些消息(例如
Transcript show: 'Category added!'
)和 return 对象。
我一直在看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 更难理解相关代码的主要思想。