This is NSException.h in view mode; [Download] [Up]
/*
Copyright (C) 1996
Ovidiu Predescu <ovidiu@bx.logicnet.ro>
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
This file is part of the FoundationExtensions library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __NSException_h__
#define __NSException_h__
#include <Foundation/NSException.h>
#include <Foundation/NSArray.h>
@interface NSException (Extensions)
- (BOOL)exceptionIsKindOfClass:(Class)class;
/* return [self isKindOfClass:class] */
- (BOOL)exceptionIsIn:(NSArray*)exceptions;
- (NSString*)errorString;
- initWithFormat:(NSString*)format, ...;
- setName:(NSString*)name;
- setReason:(NSString*)reason;
- setUserInfo:(NSDictionary*)userInfo;
@end /* NSException (Extension) */
/*
* The new macros for handling exceptions.
*/
#define TRY \
({ \
__label__ _quit; \
NSHandler exceptionHandler; \
int __setjmp_ret = setjmp(exceptionHandler.jumpState); \
if(!__setjmp_ret) { \
_NSAddHandler(&exceptionHandler);
#define END_TRY \
_NSRemoveHandler(&exceptionHandler); \
goto _quit; /* to remove compiler warning about unused label*/ \
} \
_quit: \
{ \
void handler(id localException) \
{ \
BOOL _caught = NO; \
if(!localException) {
#define CATCH(exception_class) \
} else if([localException isKindOfClass:[exception_class class]]) { \
_caught = YES;
#ifndef PRECOMP
# define MULTICATCH(exception_classes...) \
} else if([localException exceptionIsIn: \
[NSArray arrayWithObjects:##exception_classes, nil]]) { \
_caught = YES;
#endif /* PRECOMP */
#define OTHERWISE \
} else { \
_caught = YES;
#define CLEANUP \
} \
if(localException && !_caught) {
#define FINALLY \
} \
if(1) {
#define END_CATCH \
} \
if(!localException) return; \
if(!_caught) \
[localException raise]; \
} \
handler(__setjmp_ret == 1 ? exceptionHandler.exception : nil); \
} \
});
/* Use BREAK inside a TRY block to get out of it */
#define BREAK ({_NSRemoveHandler(&exceptionHandler); goto _quit;})
#ifndef PRECOMP
/* If you want to generate an exception issue a THROW with the exception
an object derived from the NSException class. */
# define THROW(exception...) [##exception raise]
#else
# define THROW(exception) [exception raise]
#endif /* PRECOMP */
/* If you want to reraise an exception inside an exception handler
just say RERAISE. */
#define RERAISE THROW(localException)
/*
* Assertions.
*/
#ifndef __FoundationException_definition__
#define __FoundationException_definition__
@interface FoundationException : NSException
@end
#endif /* __FoundationException_definition__ */
@interface AssertException : FoundationException
@end
#ifndef PRECOMP
#define Assert(condition) \
({if(!(condition)) {\
NSLog([@"Assertion failed: " stringByAppendingString:(@#condition)]); \
THROW([AssertException new]); \
} \
0;})
#endif /* PRECOMP */
#endif /* __NSException_h__ */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.