Programmer's Reference

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 saying
         '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 ].


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]