簡體   English   中英

文字記錄的Smalltalk錯誤處理

[英]Smalltalk Error handling with Transcript

假設我有以下方法:

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

現在,方法#addCategory可以返回其他一些對象(例如Foo類),也可以引發錯誤(使用Error signal: 'message' )。

  • 如果發生錯誤,我想在“成績單”上打印錯誤消息。
  • 如果是對象,我想在成績單上打印一些消息(例如, Transcript show: 'Category added!' )並返回該對象。

我一直在看aBlock ifError: aBlock ,像這樣:

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

但是我不太清楚后來如何處理可變cat ,以便獲得我想要的行為。

這是另一種方法。 想法是將您的代碼封裝起來,好像不會失敗,並用on: Error包裹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回答。 還要注意,在錯誤處理程序塊內無需^nil

請記住, on:do:的想法是允許您編寫朴素的代碼,然后處理可能的錯誤情況,而無需將它們內聯到代碼的無錯誤部分。

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

您的解決方案是可以的,但可以在主代碼中內嵌錯誤處理代碼,這會使讀者更難理解相關代碼的主要思想。

解決此問題的一種可能方法如下:

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

此解決方案會將錯誤輸出到“成績單”,並從該方法返回nil 如果沒有錯誤,代碼將繼續,在“成績單”上打印消息並返回對象。

這可能不是最好的解決方案,但這是一種可行的方法。 只要您不介意錯誤時返回nil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM