在运算符重载(c ++)中对异常使用 throw [重复]

Posted

技术标签:

【中文标题】在运算符重载(c ++)中对异常使用 throw [重复]【英文标题】:Using throw for exceptions in operator overloading (c++) [duplicate] 【发布时间】:2015-06-06 07:28:08 【问题描述】:

我对异常和处理知之甚少。我有一个围绕类 PolylinePoint 定义的代码。在这种情况下,Point 取决于 Polyline。并且描述了运算符重载方法。由于 "throw" ,我在其中一个中遇到了麻烦,因为我不太明白。

我的代码是:

//defining the operator overloading method for []
Point & Polyline::operator[](int index) const 
   //defining the exception (why don't use "try"?)
   if (index >= num)  
      throw out_of_range("Index out of range");
   

   // if everythings OK, it returns the object reference
   return p[index];

所以,问题

throw 到底是为了什么(我知道它是为索引超出范围提供异常),但为什么要使用 throw 而不是使用 cout 或类似的简单建议?为什么不使用try?

谢谢

【问题讨论】:

异常机制允许程序在适当的级别捕获它们并尝试解决它们。打印出来的东西很好,但是——就其本身而言——它只会解释你的程序为什么停止工作。 trycatch 用于调用可能throw的代码。我真的建议你读一本 C++ 书。 您好,谢谢!我确实阅读了一些书籍和网页,但我只是在这段代码中没有明确,它并没有停止工作,我只是想让它更清晰或更好。 【参考方案1】:

这里我们用 throw 来表示错误的严重性。如果我们只是简单地建议使用 cout,那么程序将在语句之后继续执行。使用 throw 可以让我们传达出在索引超出范围时,不应再执行正常的函数体。

没有 try-catch 块表明该函数不打算处理索引范围越界错误,而只是将程序控制权转移到其他地方由 catch 块处理。

【讨论】:

谢谢,我现在更清楚了【参考方案2】:

'throw' 是为了与调用堆栈中某处的调用函数进行通信,表明出现了问题并且发生了异常情况。在这样的函数中,假设有一个函数将在其主体中对执行期间出现的任何异常负责——try 块。

换句话说,throw 表示发生了错误。 在程序的其他地方有一个try块来捕获抛出的异常,或者应该有,因为未处理的异常会使程序调用terminate

【讨论】:

嗨,谢谢。我明白了 throw 是如何指示错误的正确方法。但是整个程序中没有try块,所以我很困惑。 如果没有try-catch,程序将终止。这对于许多异常都是可以接受的,包括您不能(例如,内存不足)或不想(例如,文件句柄不足)从中恢复的异常。

以上是关于在运算符重载(c ++)中对异常使用 throw [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用类|| 运算符重载友元

在 C 中对指向对象的指针使用方法

如何在java中对不同的数据类型进行排序并将它们打印在一个表中? (使用方法重载)

使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试

在c ++中对非数组变量使用delete [] [重复]

如何在 C++Function 调用中对参数使用 & 修饰符