【问题标题】:C++ catch error and exit the functionC++ 捕获错误并退出函数
【发布时间】:2018-07-10 23:19:52
【问题描述】:

我使用 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 来检查输入是否超出范围,如果超出则抛出错误。

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

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

【问题讨论】:

  • 只是不要捕获那个异常,或者抛出一个新异常
  • OT:不要抛出字符*。总是抛出从 std::exception 派生的东西。捕获为 const &。使用 std::runtime_error 获取处理 std::string 消息的异常。

标签: c++ templates error-handling


【解决方案1】:

但是,如果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;
}

【讨论】:

  • 如果我重新抛出异常,似乎错误消息msg不会被打印出来?最后,会有一个未处理的异常。如何显示msg
  • @YongliangHe 尝试打印到std::cerr
【解决方案2】:

您也可以在这种情况下使用 optional。这种构造的一个想法是表明由于某些错误而无法正确设置值。

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
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我正在尝试从具有此特定偏移量的缓冲区中获取值,所以我担心返回任何 special_value_for_errors 可能会产生误导?因为存储在缓冲区中的值可能等于 `special_value_for errors'?
    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 2015-12-06
    • 2023-03-21
    • 2014-02-27
    • 2010-10-03
    • 2014-11-09
    相关资源
    最近更新 更多