在运算符重载(c ++)中对异常使用 throw [重复]
Posted
技术标签:
【中文标题】在运算符重载(c ++)中对异常使用 throw [重复]【英文标题】:Using throw for exceptions in operator overloading (c++) [duplicate] 【发布时间】:2015-06-06 07:28:08 【问题描述】:我对异常和处理知之甚少。我有一个围绕类 Polyline 和 Point 定义的代码。在这种情况下,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?
谢谢
【问题讨论】:
异常机制允许程序在适当的级别捕获它们并尝试解决它们。打印出来的东西很好,但是——就其本身而言——它只会解释你的程序为什么停止工作。try
和 catch
用于调用可能throw
的代码。我真的建议你读一本 C++ 书。
您好,谢谢!我确实阅读了一些书籍和网页,但我只是在这段代码中没有明确,它并没有停止工作,我只是想让它更清晰或更好。
【参考方案1】:
这里我们用 throw 来表示错误的严重性。如果我们只是简单地建议使用 cout,那么程序将在语句之后继续执行。使用 throw 可以让我们传达出在索引超出范围时,不应再执行正常的函数体。
没有 try-catch 块表明该函数不打算处理索引范围越界错误,而只是将程序控制权转移到其他地方由 catch 块处理。
【讨论】:
谢谢,我现在更清楚了【参考方案2】:'throw' 是为了与调用堆栈中某处的调用函数进行通信,表明出现了问题并且发生了异常情况。在这样的函数中,假设有一个函数将在其主体中对执行期间出现的任何异常负责——try
块。
换句话说,throw
表示发生了错误。 在程序的其他地方有一个try块来捕获抛出的异常,或者应该有,因为未处理的异常会使程序调用terminate
。
【讨论】:
嗨,谢谢。我明白了 throw 是如何指示错误的正确方法。但是整个程序中没有try块,所以我很困惑。 如果没有try-catch,程序将终止。这对于许多异常都是可以接受的,包括您不能(例如,内存不足)或不想(例如,文件句柄不足)从中恢复的异常。以上是关于在运算符重载(c ++)中对异常使用 throw [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在java中对不同的数据类型进行排序并将它们打印在一个表中? (使用方法重载)
使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试