即使代码在 try/catch 块中,我也会不断收到异常 [关闭]
Posted
技术标签:
【中文标题】即使代码在 try/catch 块中,我也会不断收到异常 [关闭]【英文标题】:I keep getting an exception even though the code is within a try/catch block [closed] 【发布时间】:2017-12-23 23:24:30 【问题描述】:如果给定的用户输入无效,我编写了一些遇到异常的代码,因此我将它放在 try/catch 块中,但它仍然抛出异常。代码本身很长,所以这里是一个也遇到异常的代码的简化版本。异常本身很清楚,位置“3”不存在,所以自然会抛出异常,但它在 try/catch 块内,所以它应该被捕获,但它没有。
int main()
try
vector<string> test = vector<string> "a","b","c" ;
string value = test[3];
catch (...)
运行此代码只会导致以下异常,无论它是否在 try/catch 块中。
我还尝试指定异常 (const out_of_range&e
),但这也无济于事。它只是导致了完全相同的异常。
int main()
try
vector<string> test = vector<string> "a","b","c" ;
string value = test[3];
catch (const out_of_range&e)
我正在使用 Visual Studio,这可能是 IDE 或其使用的编译器的问题吗?
【问题讨论】:
元素 3 不是您的向量的成员。请改用 2。 计算机系统有不同类型的异常。你只能捕获那些从 C++ 本身抛出的,而不是那些由软件、操作系统或硬件错误引起的。像这样的崩溃你需要learn how to debug your programs。 至于您的崩溃背后的原因,您应该回到您的beginners books 并查看它们。 我知道崩溃背后的原因,这是导致超出范围异常的示例代码,以展示如何未捕获异常,如我的帖子“异常本身很清楚,位置“3”并不存在,它会自然而然地抛出异常,但它在 try/catch 块内,所以它应该被捕获,但它没有。” 不,使用operator[]
将不会使用标准 C++ 引发异常。 Visual C++ 运行时库可能会在调试版本中执行此操作,但这是一个非标准扩展。当抛出异常时,它也可能会抛出一个对话框。如果您让程序继续运行,catch
可能会捕获它。 Visual C++ 有时有点奇怪。
【参考方案1】:
如果你想让std::vector
抛出一个std::out_of_range
异常,你需要使用.at()
方法。 operator[]
不会抛出异常。
例如,你可以这样做:
std::vector<int> myvector(10);
try
myvector.at(20)=100; // vector::at throws an out-of-range
catch (const std::out_of_range& e)
std::cerr << "Out of Range error: " << e.what() << '\n';
【讨论】:
【参考方案2】:这也不例外。那是调试断言失败。
如果你想要一个异常,你需要使用向量的 at(index) 函数而不是数组下标运算符。
【讨论】:
【参考方案3】:operator[] 在向量容器中被重载但不是异常安全的(在失败的情况下行为是未定义的,例如你上面的帖子)
您应该改用 .at() 函数。这是异常安全的。 cplusplus.com 的参考资料说:
Strong guarantee: if an exception is thrown, there are no changes in the container.
It throws out_of_range if n is out of bounds.
阅读: http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/
查看底部的异常安全性。
【讨论】:
以上是关于即使代码在 try/catch 块中,我也会不断收到异常 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
即使存在 try/catch 块,应用程序也会在空对象引用上出现“布尔 android.content.Intent.migrateExtraStreamToClipData()”
JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗
将所有内容包装在 try/catch 块中是不是构成防御性编程?
若catch中抛出运行时异常,请问在try catch语句块中return语句是写在try中还是写在try catch语句外。