その中でもC26438の「gotoは使わない」が厄介だ。
最近の人は教育が行き届いていて、gotoのような劇薬から遠ざけられているおかげでどう修正していいのか見当がつかない。ということを雑談しているときに気づいた。
自分の忘備録と他にも困った人のために、修正方法をメモる。
今回はエラーがあったらgoto先に飛ばして終わらせるパターン。
void AruClass::someFunction(uint8_t param) { if( sendFunction( param) < 0) { goto errorExit; } if( recvFunction() < 0) { goto errorExit; } parseRecvData(); errorExit: cleanupBuffer(); return; }
こんなケースだ。
一番わかりやすいケースで、exceptionにしてやればいいだけだ。
void AruClass::someFunction(uint8_t param){ try{ if( sendFuntion( param) < 0) { throw std::exception(); } if( recvFunction() < 0) { throw std::exception(); } parseRecvData(); } catch(...){ // error case } cleanupBuffer(); return; }