使用未引用的局部变量警告捕获异常

Pup*_*sik 7 c++ visual-studio c++11 visual-studio-2013

我有以下代码:

try {
    // do some stuff
}
catch(const my_exception_type& e) {
    LOG("Exception %s", e.what());
    throw;
}
Run Code Online (Sandbox Code Playgroud)

问题是在调试版本LOG中定义为#define LOG(...) real_logger(...),但在版本构建中定义为#define LOG(...) \\ do nothing.

当然,当我在Visual Studio中编译我的发布代码时,我得到了warning C4101: 'e' : unreferenced local variable.

处理异常日志记录的最佳做法是什么,而不会产生任何不必要的警告?

PS
我除了记录和重新抛出它之外什么都不做.

Mat*_*247 7

您可以通过将对象强制转换为 void 来将对象标记为“已使用”。它对生成的机器码没有影响,但会抑制编译器警告。

try {
    // do some stuff
}
catch(const my_exception_type& e) {
    (void)e;
    LOG("Exception %s", e.what());
    throw;
}
Run Code Online (Sandbox Code Playgroud)


Sga*_*Sga 4

您可以在每个 catch 块中添加#ifdef一行catch(非常具有侵入性)或仅添加一行:

catch(const my_exception_type& e) {
    UNREFERENCED_PARAMETER(e);
    LOG("Exception %s", e.what());
    throw;
}
Run Code Online (Sandbox Code Playgroud)

并且警告消失了。或者,您可以仅在调试版本中#define MY_EXCEPTION_CATCH(...)定义参数。e