简单的问题。
我面前有这个代码:
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?)是什么?
我想知道如何使用例外
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;
}
使用嵌套的if语句
if ( somethings() ) {
// do somethings...
if ( somethings1() ) {
// ... (eventually too many indent)
if ( somethingsN() ) {
return true;
}
}
}
delete myData;
return false;
你的方法是什么? 我只想在这里改进我的编码风格。
"请勿使用'删除',请使用智能指针,例如unique_ptr" (谢谢大家)
答案 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());
}
当然没有delete
。 unique_ptr
是你的朋友。