C ++ - 避免使用多个if语句来管理错误

时间:2014-12-12 10:14:41

标签: c++ if-statement coding-style

简单的问题。

我面前有这个代码:

if ( somethings() == false ) {
    log("error when ...somethings()");
    return false;
}
// do somethings
if ( somethings2() == false ) {
    log("error when ...somethings2()");
    return false;
}
// ...
// eventually
if ( somethingsN() == false ) {
    log("error when ...somethingsN()");
    delete myData;
    return false;
}

不性感吧?改进此代码的最佳方法(/ pattern?)是什么?

解决方案1:

我想知道如何使用例外

try {
    if ( somethings() == false )
        throw std::runtime_error("error when ...somethings()");
    // do somethings
    if ( somethings2() == false )
        throw std::runtime_error("error when ...somethings2()");
    // ...
    if ( somethingsN() == false )
        throw std::runtime_error("error when ...somethingsN()");
}
catch ( std::exception& e ) {
    log(e.what());
    delete myData;
    return false;
}

解决方案2:

使用嵌套的if语句

if ( somethings() ) {
    // do somethings...
    if ( somethings1() ) {
        // ... (eventually too many indent)
        if ( somethingsN() ) {
            return true;
        }
    }
}
delete myData;
return false;

你的方法是什么? 我只想在这里改进我​​的编码风格。

注意(编辑)

"请勿使用'删除',请使用智能指针,例如unique_ptr" (谢谢大家)

2 个答案:

答案 0 :(得分:2)

在错误时抛出异常,而不是为调用者返回一个魔术值来检查;避免动态分配,除非你真的需要它;当你真的这样做时,使用智能指针或其他RAII类型来管理它。然后代码变得更加直接:

somethings();
somethings2();
// ...
somethingsN();

答案 1 :(得分:0)

#define CHECK(x) \
  do { if (!(x)) throw MyException(#x, __FILE__, __LINE__); } while(0)

try {
  // call third-party or 
  // C functions that don't throw
  CHECK(thisone());
  CHECK(thatone());
  CHECK(theotherone());
  // call my own functions
  anotherone(); // throws
  yetanotherone(); // throws
} catch (std::exception& e) {
  log(e.what());
}

当然没有deleteunique_ptr是你的朋友。