C ++嵌套方法try catch(practices)

时间:2016-01-07 14:26:35

标签: c++ c++11 exception

我是C ++的新手(来自C)并编写了一个类B,它是另一个类A的成员。

如果父成员尝试访问B容器中不存在的数据(我抛出B异常),则成员invalid_argument将抛出异常。成员B有一个可以被认为是STL容器的对象,所以它就是这个例子。

我的问题是:如果我在A中捕获原始的invalid_parameter异常,那么重新抛出相同的异常是否被认为是很好的C ++实践(我重新抛出原始错误,但我做了一些登录,所以what()是不同的),或者我可以抛出std::exception。我的代码现在有很多

try { A.calls_b_exception } catch (std::invalid_argument& ie) {...} catch (std::exception& e) {...}

阻止,我想知道我是否可以将它们减少到

try { A.calls_b_exception } catch (std::exception& e) {...}

仍然遵循良好的C ++范例。 示例代码与我的情况类似:

class B
{
    std::vector<int> stuff;

    int get_value(int index)
    {
       if (index >= stuff.size()) {
            stringstream err;
            err << "--> invalid index " << index << " for stuff";
            throw std::invalid_argument(err.str());
        }
    }
}

class A
{
    B b;
    // Assume there are methods to add a bunch of stuff to B
    int get_value(int index) 
    {
        try {
            b.get_value();
        } catch (std::invalid_argument& ie) {
            stringstream err;
            err << ie.what() << "\n\t--> A::get_value(" << index << ")";
            // should I throw the same exception here or is this considered good C++ etiquette?
            throw std::exception(err.str());
        } catch (std::exception& e) {
            throw;    // something I was not anticipating handling happened
        }
    }
}

int main
{
    A a;
    // Assume more stuff to add to A
    try {
        a.get_value(-1);
    }
    catch (std::exception& e) {
        stringstream err;
        err << "--> invalid index " << index << " for main";
        throw std::exception(err.str());exception here?
    }
}

1 个答案:

答案 0 :(得分:0)

您无法实例化std::exception(std::string),因此我的初始方法无效。 感谢那些花时间阅读我的问题并帮助我的人。