[Seaside] Error handlers and critical sections
C. David Shaffer
cdshaffer at acm.org
Fri Sep 14 01:33:20 UTC 2007
Ron Teitelbaum wrote:
> Hi David,
>
> I'm not sure I really understand your question. There is a place in the
> code for handling exceptions. If you make your own subclass of WASession
> then you can implement something like this:
>
> withErrorHandler: aBlock
> "override and extend the basic seaside exception handling"
>
> ^[[super withErrorHandler: [aBlock
> on: USMRSDBObjectRegister do: [:ex | self registerObject: ex
> object. ex resume]]]
> on: USMRSDBProxyReifier do: [:ex | self getObject: ex
> object. ex resume]]
> on: USMRSDBCurrentCommitManager do: [:ex | ex resume: self
> currentCommitManager].
>
>
>
Yes! I think that would be better...but with some minor differences.
All of your handlers jump back into the signaling context (they are more
like Notifications). There's no unwinding to be done. I'm talking
about dealing with unexpected Errors. Let me spell out an example:
MyComponent>>someCallbackMethod
model doSomethingImportant
now in my model
MyModel>>doSomethingImportant
[self useSomeResource. UnexpectedError signal] ensure: [self
freeSomeResource]
This ensure: block will never run unless UnexpectedError is handled and
that handler block exits. This never happens if you use subclasses of
WAErrorHandler to deal with errors...hence my unwindTo: attempt. Your
example led me to:
MySession>>withErrorHandler: aBlock
^super withErrorHandler: [aBlock on: Error do: [:ex | MyErrorLogger
logError: ex].
self returnResponse: ...]
Notice that in order to satisfy the requirement that the resource be
freed the "self returnResponse:" must be outside the error handler so
that the ensure: blocks gets invoked. I think this is much better than
my previous approach. Thanks Ron!
David
More information about the seaside
mailing list