C ++断言函数,用于检查是否抛出异常

时间:2013-03-27 20:01:39

标签: c++ exception assertion

我熟悉标准C ++断言是如何工作的。这在我的项目中用于各种测试目的。

例如,假设我想检查我的代码是否抛出了某个异常。

这可以不使用像CPPUnit这样的测试框架吗?

4 个答案:

答案 0 :(得分:6)

您可以手动执行相同的操作CPPUnit does

bool exceptionThrown = false;

try
{
    // your code
}
catch(ExceptionType&) // special exception type
{
    exceptionThrown = true;
}
catch(...) // or any exception at all
{
    exceptionThrown = true;
}

assert(exceptionThrown); // or whatever else you want to do

当然,如果你经常使用这个模式,那么为此使用宏是有意义的。

答案 1 :(得分:2)

骨架(未测试)

#define MY_ASSERT(f, e) {\
    try {\
        f();\
    } catch (std::exception &e) {\
        ...\
    }\
}

答案 2 :(得分:1)

这是我根据@JPlatte和@ gongzhitaao的答案编写的异常测试程序。对于我的测试框架,我有两个全局变量num_testnum_test_success,用于跟踪执行的测试数量以及在一系列测试中成功完成的数量,但这可以根据您的需要进行更改。

int num_test;
int num_test_success;

#define UT_ASSERT_THROW(expression, ExceptionType) {            \
                                                                \
    try {                                                       \
        expression;                                             \
        printf("test %d:    *** FAILURE ***     %s:%d:%s,%s\n", \
               num_test, __FILE__, __LINE__,                    \
               #expression, #ExceptionType);                    \                                 
    } catch (const ExceptionType &) {                           \
        printf("test %d:    success\n", num_test);              \
        ++num_test_success;                                     \
    } catch (...) {                                             \
        printf("test %d:    *** FAILURE ***     %s:%d:%s,%s\n", \
               num_test, __FILE__, __LINE__,                    \ 
               #expression, #ExceptionType);                    \
    }                                                           \
                                                                \
    ++num_test;                                                 \
                                                                \
}

__FILE____LINE__展开到当前文件和行号(请参阅https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html)。宏内部的井号告诉预处理器将参数作为字符串放入宏扩展中(参见http://bruceblinn.com/linuxinfo/Stringification.html)。

答案 3 :(得分:-3)

代码内断言通常在方法的开头使用,以便在输入此特定函数之前确认满足某些前置条件 例如:

Window::paint()
{
  assert(m_device != NULL);
  m_device->repaintRegion();
}

他们主要是为了捕获方法或类之间未满足的依赖关系的错误

测试框架中的断言是不同的,通常用于单元测试,以确保单元返回任何返回所需的内容。

通常在现实(即外部系统)为我们提供代码不能/不应该处理的情况下抛出异常。对于罕见但仍然存在的问题,这是一个简单的方法。例如 - 等待服务器通常可用的超时时间。或者,没有足够的记忆。我不会将它用作编程逻辑的辅助工具。

对于您的问题,可能有一种方法可以通过使用try-catch测试单元来捕获测试框架中的异常。但我不确定它是否真的令人满意。

HTH