Some details in question…
Multiple nested Ifs are always wacky, as well as multiple returns:
There are some ways people usually improve coding:
int func()
{
CSomeResource* pResource = NULL;
int err = 0;
err = f1();
if (!err) {
err = f2(&pResource);
}
if (!err) {
err = f3(pResource);
}
…
if (!err) {
err = fn();
}
// error handling and freeing resources
If (err && pResource) {
delete pResource;
pResoruce = NULL;
}
return (err);
}
---
Another approach is to leverage the WDF idiom:
int func()
{
CSomeResource* pResource = NULL;
int err = 0;
do {
err = f1();
if (err) {
break;
}
err = f2(&pResource);
if (err) {
break;
}
err = f3(pResource);
if (err) {
break;
}
…
err = fn();
if (err) {
break;
}
} while (false);
// error handling and freeing resources
If (err && pResource) {
delete pResource;
pResoruce = NULL;
}
return (err);
}
---
What I meant in the initial question is:
int func()
{
CSomeResource* pResource = NULL;
int err = 0;
err = f1();
if (err) {
goto ErrorHandler;
}
err = f2(&pResource);
if (err) {
goto ErrorHandler;
}
err = f3(pResource);
if (err) {
goto ErrorHandler;
}
…
err = fn();
if (err) {
goto ErrorHandler;
}
// error handling and freeing resources
ErrorHandler:
If (err && pResource) {
delete pResource;
pResoruce = NULL;
}
return (err);
}
---
Thanks
|