Exception.st
author claus
Fri, 25 Feb 1994 13:58:55 +0100
changeset 54 06dbdeeed4f9
parent 44 b262907c93ea
child 68 59faa75185ba
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#Exception
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    14
         instanceVariableNames:'signal parameter errorString
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    15
                                suspendedContext handlerContext
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
                                resumeBlock rejectBlock'
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    17
         classVariableNames:'EmergencyHandler'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
         poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
         category:'Kernel-Exceptions'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
Exception comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    27
$Header: /cvs/stx/stx/libbasic/Exception.st,v 1.6 1994-02-25 12:57:09 claus Exp $
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    28
'!
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    29
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    30
!Exception class methodsFor:'documentation'!
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    31
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    32
documentation
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    33
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
Instances of Exception are passed to a Signal handling block as argument.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
The handler block may perform various actions by sending corresponding messages
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
to the exception handler. The following actions are possible:
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
        reject          - dont handle this signal;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
                          another handler will be searched for, 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
                          upper in the calling hierarchy
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
        proceed         - continue after the Signal>>raise, returning nil as value
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
        proceedWith:val - same, but return val from Signal>>raise
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
        return          - return from the Signal>>handle:do:, returning nil as value
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
        return:val      - same, but return val from Signal>>handle:do:
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
        restart         - restart the Signal>>handle:do:, after repairing
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
Via the Exception object, the handler can also query the state of execution,
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    51
where the Signal was raised, where the handler is, the signal which caused
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    52
the error and the errorString passed when the signal was raised:
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    53
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    54
instance variables:
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    55
        signal          - the signal which caused the exception
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    56
        parameter       - a parameter (if any) which was passed when raising
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    57
                          the signal (only if raised with #raiseWith:aParameter)
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    58
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    59
        errorString     - an errorString (only if raised wiith #raiseWith:errorString:)
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    60
        suspendedContext- the context where the signal raise occured
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    61
        handlerContext  - the context of the handler itself
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    62
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    63
        resumeBlock     - private to the exception; needed to perform resume action
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    64
        rejectBlock     - private to the exception; needed to perfomr reject action
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    65
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    66
No Emergency mechanism is currently implemented - an unhandled signal currently
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    67
goes always into the debugger; the method found dealing with it exist only
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
    68
for compatibility reasons only.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    69
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    70
instance variables:
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    71
    signal           <Signal>   the signal which is responsible for all of this
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    72
    parameter        <Object>   the parameter passed to raiseRequestWith: or nil (for raise)
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    73
    errorString      <String>   the signals notifierString, or the string given to raise
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    74
    suspendedContext <Context>  the context, in which the raise occured
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    75
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    76
    handlerContext   <Context>  the handlers (if found) context
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    77
    resumeBlock      <Block>    used during handler evaluation to get back
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    78
    rejectBlock      <Block>    used during handler evaluation to reject
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    79
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    80
Class variables:
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    81
    EmergencyHandler <Block>    this block is evaluated, if no handler was defined
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    82
                                for a signal (i.e. this one is responsible for the
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    83
                                unhandled exception debugger).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    84
                                Having this being a block allows to globally catch
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    85
                                these errors - even if cought by someone not nesting
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    86
                                around the erronous code (as the catch/through does).
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    87
"
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    88
! !
3
24d81bf47225 *** empty log message ***
claus
parents: 1
diff changeset
    89
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    90
!Exception class methodsFor:'initialization'!
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    91
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    92
initialize
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    93
    EmergencyHandler := [:ex :con |
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    94
"
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    95
        (ex signal) error:('unhandled exception: ' , ex signal notifierString)
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    96
"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    97
        (ex signal) enterDebuggerWith:('unhandled exception: ' , ex errorString).
12
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    98
    ]
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
    99
! !
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   100
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   101
!Exception class methodsFor:'defaults'!
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   102
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   103
emergencyHandler
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   104
    "return the handler used for unhandled exceptions"
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   105
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   106
    ^ EmergencyHandler
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   107
!
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   108
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   109
emergencyHandler:aTwoArgBlock
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   110
    "set the handler used for unhandled exceptions"
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   111
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   112
    EmergencyHandler := aTwoArgBlock
8e03bd717355 *** empty log message ***
claus
parents: 3
diff changeset
   113
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
!Exception methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
signal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
    "return the signal, that caused the exception"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    ^ signal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   123
parameter
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   124
    "return the parameter passsed with the signal raise
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   125
     (or nil, if there was none)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    ^ parameter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   130
errorString 
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   131
    "return the errorString passsed with the signal raise
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   132
     (or nil, if there was none)"
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   133
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   134
    ^ errorString
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   135
!
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   136
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   137
handlerContext
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   138
    "return the context of the handler"
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   139
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   140
    ^ handlerContext
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   141
!
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   142
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
suspendedContext
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   144
    "return the context in which the raise occured"
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   145
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   146
    ^ suspendedContext
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
!Exception methodsFor:'setup'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   151
signal:aSignal parameter:aParameter errorString:aString suspendedContext:sContext
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   152
    "set the fields usable for inspection by the handler
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   153
     - only to be sent from the signal when raising"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   155
    signal := aSignal.
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   156
    parameter := aParameter.
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   157
    errorString := aString.
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   158
    suspendedContext := sContext.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
handlerContext:aContext
44
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   162
    "set the context of the handler.
b262907c93ea *** empty log message ***
claus
parents: 12
diff changeset
   163
     - only to be sent from the signal when raising"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    handlerContext := aContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
rejectBlock:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
    "this is meant to be sent by Signal only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
    rejectBlock := aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
resumeBlock:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    "this is meant to be sent by Signal only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    resumeBlock := aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
!Exception methodsFor:'handler actions'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
reject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    "handler decided not to handle this signal -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
     system will look for another handler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
    rejectBlock value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    "Continue after the raise - the raise returns nil"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
    resumeBlock value:nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
resumeWith:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    "Continue after the raise - the raise returns value"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    resumeBlock value:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
proceed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
    "Continue after the raise - the raise returns nil"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
    resumeBlock value:nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
proceedWith:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    "Continue after the raise - the raise returns value"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    resumeBlock value:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
return
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
    "Continue after the handle:do: - the handle:do: returns nil"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    handlerContext resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
returnWith:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
    "Continue after the handle:do: - the handle:do: returns value"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    handlerContext resume:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
restart
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
    "restart the handle:do: - usually after some repair work is done
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
     in handler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
    handlerContext restart
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
! !