C ++捕获错误并退出该函数

时间:2018-01-31 18:28:20

标签: c++ templates error-handling

我使用try {} catch(){}来处理返回模板类型的函数中的错误。

 T get (int iOffset) const
    {
        try {
            checkIndex(iOffset);
        }
        catch (char const* msg) {
            std::cout << msg << std::endl;
        }
        int index = (m_iReadIdx + iOffset) % m_iBuffLength;
        float  a = m_ptBuff[index];
        return a;
    }

该函数首先调用checkIndex来检查输入是否超出范围,如果是,则抛出错误。

但是,如果get引发错误,我不希望外部checkIndex返回任何值,因为返回的值可能被其他函数使用或打印错误。如果我在catch区块中返回,我不知道该返回什么,因为它是一个模板。如果我不这样做,catch块后面的代码仍会被执行,因此会返回一个值。

有没有办法做到这一点?我是C ++的新手,想知道人们在这种情况下通常如何进行错误处理?谢谢!

3 个答案:

答案 0 :(得分:2)

  

但是,如果checkIndex引发错误,我不希望外部get返回任何值,因为返回的值可能被其他函数使用或打印错误。

您可以在记录

后始终重新抛出异常
T get (int iOffset) const
{
    try {
        checkIndex(iOffset);
    }
    catch (char const* msg) {
        std::cout << msg << std::endl;
        throw; // Just re-throw the exception
    }
    int index = (m_iReadIdx + iOffset) % m_iBuffLength;
    float  a = m_ptBuff[index];
    return a;
}

答案 1 :(得分:2)

您也可以在这种情况下使用可选项。这种结构的一个想法是指出由于某些错误而无法正确设置值。

std::optional< T > get (int iOffset ) const
    {
        try {
            checkIndex(iOffset);
        }
        catch (char const* msg) {
            std::cout << msg << std::endl;
            return std::optional< T >();
        }
        int index = (m_iReadIdx + iOffset) % m_iBuffLength;
        float  a = m_ptBuff[index];
        return return std::optional< T >( a );
    }

使用此类功能可能如下所示:

auto result = get( someOffset );
if( result )
{
  // correct, processing result
}

答案 2 :(得分:1)

最简单的方法之一就是首先要做出决定:如果无法返回正确的&#39;那么你的get()究竟应该返回什么?值? 在许多情况下,它只是0,或-1,或其他一些特殊值。 然后代码变得非常简单:

 T get (int iOffset) const
    {
        T a;
        try {
            checkIndex(iOffset);
            int index = (m_iReadIdx + iOffset) % m_iBuffLength;
            a = m_ptBuff[index];
        }
        catch (char const* msg) {
            a = special_value_for_errors;
            std::cout << msg << std::endl;
        }
        return a;
    }
相关问题