Let us define an IDL interface for a "MyObject" object, which declares a "BAD_FLAG" exception, which can be raised by the "checkFlag"method, in a file called "myobject.idl":
interface MyObject {
exception BAD_FLAG { long ErrCode; char Reason[80]; }
void checkFlag(in unsigned long flag) raises(BAD_FLAG);
};
The SOM IDL compiler will map the exception to the following C language constructs, in myobject.h:
typedef struct BAD_FLAG {
long ErrCode;
char Reason[80];
} BAD_FLAG;
#define ex_BAD_FLAG "MyObject::BAD_FLAG"
A client program that invokes the "checkFlag" method might contain the following error handling code. (Note: The error checking code below lies in the user-written procedure, "ErrorCheck," so the code need not be replicated through the program.)
#include "som.h"
#include "myobject.h"
boolean ErrorCheck(Environment *ev); /* prototype */
main()
{
unsigned long flag;
Environment ev;
MyObject myobj;
char *exId;
BAD_FLAG *badFlag;
StExcep *stExValue;
myobj = MyObjectNew();
flag = 0x01L;
SOM_InitEnvironment(&ev);
/* invoke the checkFlag method, passing the Environment param */
_checkFlag(myobj, &ev, flag);
/* check for exception */
if (ErrorCheck(&ev))
{
/* ... */
somExceptionFree(&ev); /* free the exception memory */
}
/* ... */
}
/* error checking procedure */
boolean ErrorCheck(Environment *ev)
{
switch (ev._major)
{
case SYSTEM_EXCEPTION:
/* get system exception id and value */
exId = somExceptionId(ev);
stExValue = somExceptionValue(ev);
/* ... */
return( TRUE);
case USER_EXCEPTION:
/* get user-defined exception id and value */
exId = somExceptionId(ev);
if (strcmp(exId, ex_BAD_FLAG) == 0)
{
badFlag = (BAD_FLAG *) somExceptionValue(ev);
/* ... */
}
/* ... */
return( TRUE);
case NO_EXCEPTION:
return( FALSE);
}
}
The implementation of the "checkFlag" method might contain the following error-handling code:
#include "som.h"
#include "myobject.h"
void checkFlag(MyObject somSelf, Environment *ev,
unsigned long flag)
{
BAD_FLAG *badFlag;
/* ... */
if ( /* flag is invalid */ )
{
badFlag = (BAD_FLAG *) SOMMalloc(sizeof(BAD_FLAG));
badFlag->ErrCode = /* bad flag code */;
strcpy(badFlag->Reason, "bad flag was passed");
somSetException(ev, USER_EXCEPTION,
ex_BAD_FLAG, (void *)badFlag);
return;
}
/* ... */
}