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

Catching exception with unreferenced local variable warning

本文关键字:局部变量 警告 异常 引用      更新时间:2023-10-16

我有以下代码:

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

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

当然,当我在VisualStudio中编译发布代码时,我会得到warning C4101: 'e' : unreferenced local variable

在不生成任何不必要的警告的情况下处理异常日志记录的最佳做法是什么?

p.S
除了记录并重新抛出异常之外,我什么也没做。

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

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

您可以#ifdef每条catch线(非常有侵入性(,或者在每个捕获块中只添加一行:

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

警告已经消失了。或者,您可以#define MY_EXCEPTION_CATCH(...)仅在调试构建中定义e参数。