Examples of exception handling
The follow examples show how to handle various situations: 
Example: printing an object
"Assume that printString will call self error: if it encounters an error condition."
| anObject |
 
[ anObject printString ]
   when: ExError
   do: [:signal |
      signal
         exitWith: [ 'Exception: ', signal argument, 'while printing a ', anObject class name ].
Example: trapping user break
"Unbreakable code"
[ 1000 timesRepeat: [ String new: 100000 ] ]
   when: ExUserBreak
   do: [:signal |
      System confirm: 'Caught user break'.
      signal resumeWith: nil ].
Example: growing a stack
"Assume that a Stack class with a push: method exists in the application."
(OverflowException := ExAll newChild)
   description: 'stack overflow'.
 
[ aStack push: anInteger ]
   when: OverflowException
   do: [:signal |
      aStack grow.
      signal retry ].
Example: propagating a different exception
| aDifferentException |
 
(aDifferentException := ExAll newChild)
   description: 'this is a different exception'.
 
[ 1 error: 'demonstration' ]
   when: ExError
   do: [:signal |
      aDifferentException signal ]
Example: top-level loop
| loopExitException |
 
loopExitException := ExAll newChild. 
 
[ [true] whileTrue: [ 
   "Body of loop; can only be exited by sending 'loopExitException signal'."
   (System confirm: 'Signal the loopExitException')
      ifTrue: [ loopExitException signal ].
 
   "Create a doesNotUnderstandException."
   1 error: 'This is for demonstration purposes' ]
   ]
      when: loopExitException
      do: [:signal |
         signal exitWith: 'bye' ]
      when: ExAll
      do: [:signal |
         System message: 'An Exception has occurred: ', signal description.
         signal retry ].
Example: close stream at end or on error
"If an error occurs, it is reported normally, but aStream is closed first."
| aStream |
 
aStream := ReadStream on: 'This is a test'. 
 
[ [ aStream atEnd ]
   whileFalse: [ Transcript nextPut: aStream next ]
   ] atEndOrWhenExceptionDo: [
      Transcript show: '...Closing the stream'.
      aStream close ]
Last modified date: 01/29/2015