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

C++ - Avoiding multiple if statements for managing errors

本文关键字:语句 if 管理 错误 C++      更新时间:2023-10-16

简单的问题。

我面前有这段代码:

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;
}

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

解决方案 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"(谢谢大家)

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

somethings();
somethings2();
// ...
somethingsN();
#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());
}

当然没有delete. unique_ptr是你的朋友。