gpt4 book ai didi

c++ - 重构 'execute and log' 模式

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:07 24 4
gpt4 key购买 nike

我发现自己一次又一次地遵循相同的模式:

if((return_code = doFoo1(...)) != CODE_OK) {
log("useful log message based on return code");
// very likely to return an error code.
}

// continue

if((return_code = doFoo2(...)) != CODE_OK) {
log("useful log message based on return code");
// very likely to return an error code.
}

任何见解如何避免这种烦人的模式并保持逻辑清晰?

最佳答案

有很多方法可以解决这个问题,这里是一个基本的方法:

bool CheckAndLog( int code )
{
if( code == CODE_OK )
return true;
log( "<some error based on code>" );
return false;
}

if( !CheckAndLog( doFoo1(...) ) )
return;

如果您还需要返回码供以后使用,您可以从 CheckAndLog 返回它,或者将它作为传递引用参数,或者甚至将 CheckAndLog 变成一个存储最新错误代码并实例化的类要使用的(可能有范围的)记录器实例。

更新 如果您需要文件和行信息,您需要 __FILE____LINE__ 宏,以免自己到处输入它们一个简单的宏就足够了:

bool CheckAndLog( int code, const char* file, unsigned line )
{
if( code == CODE_OK )
return true;
std::cerr << "file " << file << " line " << line
<< "<errormessage>" << std::endl;
return false;
}

#define CHECK( what ) (CheckAndLog( what, __FILE__, __LINE__ ))

更进一步,将调用的函数放入其中:因为它可以作为宏参数使用,所以它被预处理器扩展为这样。这意味着,如果您键入 CHECK( foobar( 65 ) ),则 what 参数将按字面意思视为 foobar( 65 ) 而不是返回值。这是理想的,因为预处理器也可以 turn that into a string :

bool CheckAndLog( int code, const char* desc, const char* file, unsigned line )
{
if( code == CODE_OK )
return true;
std::cerr << desc << " from file " << file << " line " << line
<< "<errormessage>" << std::endl;
return false;
}

#define STRINGIZE1( x ) #x
#define STRINGIZE( x ) STRINGIZE1( x )
#define CHECK( what ) (CheckAndLog( what, STRINGIZE( what ), __FILE__, __LINE__ ))

我建议不要使用 CHECK 作为宏的名称,因为单元测试库也经常使用它。还要非常小心,不要将宏(无意或有意)重新定义为 #define CHECK( what ) (true) 之类的东西,因为这意味着如果你写CHECK( foobar( 65 ) ),该函数将永远不会被调用。

关于c++ - 重构 'execute and log' 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30659537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com