[Zope-Coders] Re: Changes to ZPublisher

Tres Seaver tseaver at zope.com
Wed Oct 6 22:11:28 EDT 2004


Richard Jones wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On Thu, 7 Oct 2004 11:19 am, Donovan Baarda wrote:
> 
>>On Thu, 2004-10-07 at 11:13, Sidnei da Silva wrote:
>>
>>>On Thu, Oct 07, 2004 at 11:10:05AM +1000, Donovan Baarda wrote:
>>>Returning None gives a 'object cannot be published because doesn't
>>>have a docstring.' which is even worse.
>>
>>Hmm... didn't notice that... nasty.
>>
>>So what is the current way for a __bobo_traverse__ to indicate "object
>>does not exist" and result in a 404?
>>
>>Perhaps AttributeError = 404 is a good idea after all...
> 
> 
> No, as already mentioned, this will mask any application bugs that raise 
> AttributeError.
> 
> NotFound exists for this purpose, doesn't it?

NotFound is an HTTP Protocol level mapping for an error;  it should 
*not* be raised by application code.  In particular, __bobo_traverse__ 
is called *both* by the publisher *and* by unrestrictedTraverse; 
raising NotFound is *totally* unexpected and inappropriate for the 
second case.  The current schizophrenia among its callers makes writing 
a sane __bobo_traverse__ implementation logically impossible.

BTW, note that the publisher *already* DWIMs AttributeError and KeyError 
into  NotFound for traversals which do not have a __bobo_traverse__; 
the proposed change just makes the DWIM more regular, and thus more 
predictable.

The alternatives are:

   - As Sidnei proposed, have the publisher map {Attribute,Key}Errors
     raised by __bobo_traverse__ onto NotFound, except when running in
     debug mode.  Don't modify unrestrictedTraverse at all.

   - Define a special error, e.g. OFS.Traversable.Nonesuch, and make
     raising it part of the contract for __bobo_traverse__;  raising
     {Attribute,Key,Index,Value}Error from __bobo_traverse__ would then
     be an unambiguous application error.  We should still decide what to
     do about such errors, and should probably remove the publisher's
     current DWIM (when it calls getattr / getitem directly).  The
     downside here is having to modify the dozen or so __bobo_traverse__
     implementations in the core, plus breaking uncountable third-party
     implementations, for the sake of API purity.

   - Morph NotFound into a more generic exception, and make it part of
     the contract (note that this is essentially identical to the
     previous alternative, except for spelling).

   - Make returning 'None' for "not found" the contract for
     __bobo_traverse__, and modify both the publisher and
     unrestrictedTraverse to look for it.  Again, we would need to
     revisit the core implementations, and risk breaking third-party
     versions.

   - Define something like Zope3's exception views, and remove all the
     hardwired exception DWIM from the publisher (not feasible, but one
     of the logical alternatives).

   - Continue to have the current set of inconsistent mappings of
     {Attribute,Key}Error to NotFound in some cases, but propagated
     as ServerError in others (note that the DWIM in question is already
     suppressed when running in debug mode, where losing the original
     exception's information might actually be a problem).

Tres.
-- 
===============================================================
Tres Seaver                                tseaver at zope.com
Zope Corporation      "Zope Dealers"       http://www.zope.com



More information about the Zope-Coders mailing list