我是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?
}
}
答案 0 :(得分:0)
您无法实例化std::exception(std::string)
,因此我的初始方法无效。
感谢那些花时间阅读我的问题并帮助我的人。