thought:
say you had code such as this...
NOTE: using C...
error handling code is redundant... and continually grows longer....Code:object* factory(parameter1, parameter2, para....) { object* a = allocate memory; if(!a) return NULL; a->member1 = allocate memory based on parameter1; if(!a->member1) { free(a); return NULL; } a->member2 = allocate memory based on parameter2; if(!a->member2) { free(a); free(a->member1); } /// etc................ return a; }
solution 1:
requires a specialized function... but it works and is cleaner...Code:void FAIL(object* obj) { free(obj->member2); free(obj->member1); // etc.... free(obj); } object* factory(parameter1, parameter2, para....) { object* a = allocate memory zeroed memory; if(!a) return NULL; if(!(a->member1 = allocate memory based on parameter1)) { FAIL(a); return NULL; } if(!(a->member2 = allocate memory based on parameter2)) { FAIL(a); return NULL; } /// etc................ return a; }
solution 2:
cleaner requires no function... uses goto(OH NOES!!!!!)...Code:object* factory(parameter1, parameter2, para....) { object* a = allocate memory zeroed memory; if(!a) return NULL; if(!(a->member1 = allocate memory based on parameter1)) goto FAIL; if(!(a->member2 = allocate memory based on parameter2)) goto FAIL; /// etc................ return a; FAIL: free(a->member2); free(a->member1); // etc.... free(a); return NULL; }
comments... suggestions? thoughts?



LinkBack URL
About LinkBacks


