Passing an ExceptionSet, rather than an Exception, to an on:do: or try:on:do:
message, results in the exception not getting caught.
ExceptionSets are created when multiple exceptions are passed, for example:
[1 / 0 ]
on: ZeroDivide, MessageNotUnderstood
do: [ :ex | ... ].
file in the following:
category: 'ANSI support'
method: ExceptionSet
handlesCategory: anObject number: anInteger
"This method may be overridden for ExceptionSelectors that are more discriminating.
For example, one might want to trap all GemStoneError numbers in a certain
range."
^selectors anySatisfy: [:each | each handlesCategory: anObject number:
anInteger].
%
category: 'Exceptions'
method: ExceptionHandler
try: aBlock on: anExceptionSelector do: anotherBlock
"anExceptionSelector is generally a subclass of ExceptionA or
an ExceptionSet containing subclasses of ExceptionA"
| protectedBlock |
protectedBlock := aBlock.
exceptionSelector := anExceptionSelector.
returnBlock := [:value | ^value].
gsException := Exception
category: exceptionSelector errorCategoryToCatch
number: exceptionSelector errorNumberToCatch
do: [:ex :cat :num :args |
"The following code can return from the #'on:do:' message by using the
returnBlock"
self caughtEx: ex number: num cat: cat args: args handler: anotherBlock.
"If we fall through, the result of the above expression will be returned
by the #'signal' message."
].
gsException handler: self.
[true] whileTrue: [
| newBlock |
(newBlock := self doTryBlock: protectedBlock) notNil ifTrue: [protectedBlock
:= newBlock].
].
%
category: 'Block Evaluation'
method: ExecutableBlock
on: selector do: action
"Try to evaluate the receiver, and should an exception occur which is
matched
by selector (normally a class object which is a subclass of ExceptionA
but can
also be an ExceptionSet with subclasses of ExceptionA), evaluate the
<monadicBlock>, action, passing it the exception instance as its argument.
This method is replaced by AnsiMisc.gs"
^(Globals at: #'ExceptionHandler') new
try: self
on: selector
do: action.
%
category: 'ANSI support'
classmethod: MessageNotUnderstood
handlesCategory: anObject number: anInteger
^anObject == GemStoneError and: [anInteger == 2010].
%
category: 'ANSI support'
classmethod: ZeroDivide
handlesCategory: anObject number: anInteger
^anObject == GemStoneError and: [anInteger == 2026].
%
category: 'Block Evaluation'
method: ExecutableBlock
on: selector do: action
"Try to evaluate the receiver, and should an exception occur which is
matched
by selector (normally a class object which is a subclass of ExceptionA
but can
also be an ExceptionSet instance with subclasses of ExceptionA), evaluate
the
<monadicBlock>, action, passing it the exception instance as its argument."
^ExceptionHandler new
try: self
on: selector
do: action.
%
Last updated: 12/13/10