[Web-SIG] wsgi.fatal_errors
Phillip J. Eby
pje at telecommunity.com
Tue Aug 31 18:11:03 CEST 2004
At 11:15 PM 8/30/04 -0700, tony at lownds.com wrote:
> > Here are some changes I've proposed in the last few days to resolve issues
> > people brought up, but which I haven't gotten much feedback on:
> >
> > * 'wsgi.fatal_errors' key for exceptions that apps and middleware
> > shouldn't
> > trap
> >
>
>What about defining an exception class that applications can raise with an
>HTML payload, which servers are supposed to send the to the client?
>Middleware should be free to alter the payload as much as they like. The
>server should not send the payload when content-type is not html.
>
>By using exceptions as a backchannel, the application and middleware do
>not have to keep track of the state to sanely handle an error.
Interesting. But I think you've just given me an idea for a possibly
simpler way to do this, with some other advantages.
Suppose that instead of 'start_response(status,headers)' we had
'set_response(status,headers,body=None)'. And the difference would be that
our 'set_response' does nothing until/unless you call write() or yield a
result from the return iterable. Therefore, you could call 'set_response'
multiple times, with only the last such call taking effect. (If you supply
a non-None 'body', then calling write() or returning an iterable is an error.)
Now consider error handling middleware: it simply calls
'set_response(error_status,error_headers,error_body)', and returns None.
At this point, we've isolated the complexity to exist only for streaming
responses once the first body chunk has been generated. We can handle this
by making a call to 'set_response()' a fatal error if a body chunk has been
generated. Thus, no special handling is needed by an exception handler: it
just tries to do 'set_response()', and allows the fatal error (if any) to
propagate. Now, the server can catch the fatal error and deal with it.
I think this will let us keep all of the complications in the server, where
they always have to exist, no matter what else we do. Exception-handling
middleware is then delightfully simple.
On the other hand, output-transforming middleware becomes somewhat more
complex, as it would now have three output sources to transform (body param
to set_response(), write(), and output iterable).
This is a fairly significant change to the spec, that introduces lots of
new angles to cover. But, I think it could be an "exceptionally" clean
solution to the problem. ;)
More information about the Web-SIG
mailing list