C ++如何检查条件并抛出异常,如Java Spring Assert

时间:2017-03-10 07:15:03

标签: c++ boost

有没有一种标准的方法来做这样的事情?

  1. 可用于发布模式(已定义NDEBUG)
  2. 检查失败时抛出异常。
  3. 标准库或提升是首选。

    为了说清楚,断言' (可能是一个不同的术语)我在这里使用,特别是关于运行时问题,而不是编程问题,比如Java世界中的Spring Assert

    Microsoft.VisualStudio.TestTools.CppUnitTestFramework是很好的候选人,但它是出于测试目的。

1 个答案:

答案 0 :(得分:4)

在我使用的一些项目中:

void ASSERT(const bool cond, const std::string& text)
{
    if (!cond)
    {
        throw std::runtime_error(text);
    }
}

如果您想了解更多信息,可以使用宏来调用实际函数,如下所示:

void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
    if (!cond)
    {
        throw std::runtime_error(text + ". In file: " + file + " on line: " + std::to_string(line));
    }
}

#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)

示例:

#include <iostream>
#include <string>
#include <stdexcept>

void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
    if (!cond)
    {
        throw std::runtime_error(text + ". In file: " + file + " on line: " + std::to_string(line));
    }
}

#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)

int main()
{
    ASSERT(false, "example text");
}

将导致:

terminate called after throwing an instance of 'std::runtime_error'
  what():  example text. In file: example.cpp on line: 17
Aborted

<强>更新

要获得与普通assert相同的行为,即无条件终止该计划,您可以拨打std::abort()(来自<cstdlib>)而不是使用throw:< / p>

void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
    if (!cond)
    {
        std::cout << text << ". In file: " << file << " on line: " << line << std::endl;
        std::abort();
    }
}

#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)