C++ 异常处理和成员变量

C++ 异常处理和成员变量,c++,exception-handling,c++11,C++,Exception Handling,C++11,我有一个简单的问题 如果我们有一个具有动态分配成员(或使用动态分配的成员)的类,并且我们经常使用该成员,那么处理该成员上的某些操作失败的最佳方法是什么。 Ofc有试捕,但我不是在说那个 (一) 我说的是这样一个事实,即现在成员处于它不应该处于的状态(这里我不是说资源泄漏,我说的是这样一个事实,例如,我们想将100个元素推回std::vector,但我们只添加了47个) 现在,例如,当我们调用另一个方法sendToDB时,我们将向DB发送47项而不是100项。 我估计解决这个问题的方法是在所有公共

我有一个简单的问题

如果我们有一个具有动态分配成员(或使用动态分配的成员)的类,并且我们经常使用该成员,那么处理该成员上的某些操作失败的最佳方法是什么。
Ofc有试捕,但我不是在说那个

(一) 我说的是这样一个事实,即现在成员处于它不应该处于的状态(这里我不是说资源泄漏,我说的是这样一个事实,例如,我们想将100个元素推回std::vector,但我们只添加了47个)

现在,例如,当我们调用另一个方法sendToDB时,我们将向DB发送47项而不是100项。 我估计解决这个问题的方法是在所有公共方法上都有bool返回值(尝试全部返回或什么都不返回(也称为push_back all 100或push 0),如果我们设法推100,则返回false,如果我们推0,则返回false

(二) 但这仍然存在动态分配成员的问题(例如shared_ptr)。 这是否意味着使用它的每个方法都必须执行以下操作:

bool MyClass::sendDataToDB()
{
    if (! m_DBConnection ) //m_DBConnection is std::shared_ptr
    return false;
   //...


}

我不完全理解你的问题,但我明白:


在您的类中,您有一个存储(类似于
vector
),然后您想在其中插入一些内容,而操作可能会在其中失败。所以您想知道插入是否失败或操作是否完成!我说得对吗?如果答案是肯定的,我认为最好的解决方案是像
iostream
这样的东西,在出现故障时设置
fail
状态,您可以稍后检查,或者
抛出异常
,但在任何情况下,设置
fail
位可以向每个人发出我的对象处于失败状态的信号

我不完全理解您的问题,但我得到以下信息:


在您的类中,您有一个存储(类似于
vector
),然后您想在其中插入一些内容,而操作可能会在其中失败。所以您想知道插入是否失败或操作是否完成!我说得对吗?如果答案是肯定的,我认为最好的解决方案是像
iostream
这样的东西,在失败的情况下设置
fail
状态,您可以稍后检查它,或者
抛出异常
,但在任何情况下,设置
fail
位都可以向每个人发出信号,表明我的对象处于失败状态

停止窃取我的身份。(\/)(;,,;;)(\/)我理解这个问题有困难,但是提到基本、强和无担保能回答你的问题吗?@R.MartinhoFernandes否,因为他们处理发生异常的地方,我在谈论这个:简单的例子m_myStruct=new myStruct(42);抛开一切美好。。。但在其他一些公共成员函数中,您使用的是m_myStruct(这是我Q的第二部分)。第一个问题是如何“记住”ex的发生。Q的第一部分的示例:基本上,调用者希望将100人的列表添加到我的类内部向量中。新计划失败了。我是通知打电话的人并让他记下,还是我在课堂上记着处理以后的电话。如果46次回推成功,我会回推46次并返回false吗?你可能对scope guards感兴趣。停止窃取我的身份。(\/)(;,,;;)(\/)我理解这个问题有困难,但是提到基本、强和无担保能回答你的问题吗?@R.MartinhoFernandes否,因为他们处理发生异常的地方,我在谈论这个:简单的例子m_myStruct=new myStruct(42);抛开一切美好。。。但在其他一些公共成员函数中,您使用的是m_myStruct(这是我Q的第二部分)。第一个问题是如何“记住”ex的发生。Q的第一部分的示例:基本上,调用者希望将100人的列表添加到我的类内部向量中。新计划失败了。我是通知打电话的人并让他记下,还是我在课堂上记着处理以后的电话。如果46个push_back调用成功,我会执行46个pop_back并返回false吗?您可能对范围保护感兴趣。是的,我的Q主要是关于程序如何“记住”失败的东西。所以我认为您的Q的设计应该像
std::iostream
!啊,但这仍然是问题的第二部分。。。如果im处于失败状态,我是否检查每个方法条目,如果是,则返回false;或者扔。。。看起来很难看,但我想不出比这更好的方法了如果你的公共方法改变了对象的状态,是的,你应该检查你的状态,例如当我们为一个流编写一个重载版本的
操作符时,我们首先检查流是否处于失败状态!但可能你可以将状态更改移动到几个函数中,然后只检查这些函数中的状态。是的,我的Q主要是关于程序如何“记住”失败的东西。所以我认为你的Q的设计应该像
std::iostream
!啊,但这仍然是问题的第二部分。。。如果im处于失败状态,我是否检查每个方法条目,如果是,则返回false;或者扔。。。看起来很难看,但我想不出比这更好的方法了如果你的公共方法改变了对象的状态,是的,你应该检查你的状态,例如当我们为一个流编写一个重载版本的
操作符时,我们首先检查流是否处于失败状态!但可能您可以将状态更改移动到几个函数中,然后只检查这些函数中的状态