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