[OGo-Developer] _e_info in NSException.h

Sebastian Reitenbach developer@opengroupware.org
Tue, 22 Jan 2008 20:25:16 +0100


developer@opengroupware.org wrote: 
> Hi,
> developer@opengroupware.org wrote: 
> > On 14.01.2008, at 11:35, Sebastian Reitenbach wrote:
> > > while changing to gnustep-make 2.0 I tried to compile sope against
> > > gnustep-base 2.15.2. In sope there is a private variable of  
> > > NSException
> > > used: _e_info. which got replaced by _reserved.
> > > Therefore I asked about it on the discuss-gnustep@ mailing list.
> > > As it is generally a bad idea to access private methods and  
> > > variables of I
> > > thing Richard is right, and it should be changed in sope.
> > 
> > Hm, yes. This is because before MacOS 10.2(?) there was a public - 
> > setUserInfo: method. This was removed from the public headers but is  
> > still provided in the implementation (of Cocoa).
> > 
> > Now I think GNUstep removed the method completely (not just from the  
> > header), hence I needed to provide an own implementation (which used  
> > the _e_info private field ...).
> > 
> > > What would be the preferred way?
> > > Adding a general NSException(UserInfo) category?
> > > Or change all occurences where this happens, I think it is only one  
> > > place in NGImap4...
> > 
> > We should (carefully!) remove all calls to -setUserInfo: (check  
> > whether userinfo fields are required by callers etc).
> Ok, I'll take a look, and will try to remove/replace these calls.
> 

I took a look at the usage of setUserInfo for exceptions in sope, and I 
found a place where the problem was solved like this:

#if NeXT_Foundation_LIBRARY || APPLE_FOUNDATION_LIBRARY || \
    COCOA_Foundation_LIBRARY
    exception = [NSException exceptionWithName:[exception name] reason:
[exception reason] userInfo:ui];
#else
    [exception setUserInfo:ui];
#endif

The other places where I found the setUserInfo, it looks like there could be 
done the same, but I would add GNUSTEP_BASE_LIBRARY to the #if clause.

But then, it could be exchanged with:
#if LIB_FOUNDATION_LIBRARY
   [exception setUserInfo:ui];
#else
    COCOA_Foundation_LIBRARY
    exception = [NSException exceptionWithName:[exception name] reason:
[exception reason] userInfo:ui];
#endif

But as the exceptionWithName should work on any foundation library, I'd just 
prefer to not use setUserInfo at all and only use sth. like the line below:

exception = [NSException exceptionWithName:[exception name] reason:
                       [exception reason] userInfo:ui];

before I go on, what would be the preferred way?


while looking for the setUserInfo, I found a setReason defined in 
sope-core/NGExtensions/NGExtensions/NSException+misc.h

#if COCOA_Foundation_LIBRARY || GNUSTEP_BASE_LIBRARY
@interface NSException (NGLibFoundationCompatibility)
- (void)setReason:(NSString *)_reason;
@end
#endif

the setReason seems to be used less frequently than the setUserInfo, so what 
about this one, keeping it as it is?

cheers
Sebastian