繁体   English   中英

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

[英]C++ catch error and exit the function

我使用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 ++的新手,想知道人们在这种情况下通常如何进行错误处理? 谢谢!

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

您总是可以在登录后重新引发异常

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;
}

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

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
}

最简单的方法之一是首先确定:如果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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM