Originally Posted by
gardhr
Great suggestions! Could you please elaborate on the third comment, though? I'm not exactly sure what you meant by that.
Suppose you're writing a library with some API called UsefulFunction():
Code:
int UsefulFunction() // returns 0 on success, negative on fail
{
DoSomeStuff();
int status = SomeInternalFunction();
if (status < 0)
return status;
DoSomeOtherStuff();
return 0;
}
A user of the library calls UsefulFunction() and it returns -1 (something bad happened). Now it is your task to debug this failure. Well, the failure must have come from SomeInternalFunction(). But why did THAT fail? Maybe SomeInternalFunction() calls functions X(), Y(), and Z(), all of which can fail, and you don't know which. Maybe it was Z() that failed. But Z() calls A() and B()... Etc.
This is a headache which usually requires a lot of repetitive stepping to figure out exactly what FIRST went wrong to trigger the cascade of error codes.
Now imagine you are using a status class like the one you've written here. You could put some code into the constructor and assignment operator which checks to see if the raw error code is negative -- if it is, you can trigger a breakpoint.
With that in place, you can reproduce the failure case, and the code will immediately break at the lowest layer where the error was actually generated in the first place. No detective work required.