在 Visual Studio 2019 中处理异常
Posted
技术标签:
【中文标题】在 Visual Studio 2019 中处理异常【英文标题】:Handle exception in Visual Studio 2019 【发布时间】:2020-07-10 20:27:28 【问题描述】:我正在尝试处理 Visual Studio Community 2019 中的异常,请注意,我不确定我的设置是否有错误,或者是因为我的代码。
我要处理的异常是 out_of_range。为了做到这一点,我将它放在一个 try 块中并捕获,但我无法处理。 程序运行时会提示一个窗口:Debug Assertion Failed! 表达式向量下标超出范围
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
int main()
try
cout << "throwing exception: \n";
throw 1;
catch (int i)
cout << "exception happended!\n";
cout << "out of exception\n";
vector<int> v;
try
cout << "throwing exception2: \n";
v[2];
catch (out_of_range e)
cout << "Exception out of range\n";
cout << e.what();
catch (exception& d)
cout << "General Exception\n";
cout << d.what();
catch (...)
cout << "special excpetinon\n";
cout << "Exception handled!";
我能够处理的第一个异常并且程序继续运行,而在第二个异常中,程序停止并显示窗口错误。
我在调试模式下运行程序,使用默认设置:
我想以与第一个异常相同的方式处理第二个异常。 谢谢!
【问题讨论】:
你确定vector的[]会抛出异常吗? 哇,太快了。我以为你可以用类似于 java ArrayIndexOutOfBoundsException 的方式来处理它。谢谢! 在Debug构建中,迭代器调试功能默认开启。由_HAS_ITERATOR_DEBUGGING
宏控制。捕捉编程错误非常有帮助,关闭它不是一个好主意。如果您想测试您的异常处理代码,只需按 F5 继续运行程序。
【参考方案1】:
调试断言失败!表达式向量下标超出范围
也不例外。那是调试器告诉您您的程序超出范围并阻止您,因此您可以检查程序并了解它是如何发生的,以防止程序超出范围。你不能抓住这个。您需要修复允许程序访问无效内存的错误。
C++ 的政策是不让程序为未明确要求的任何东西付费。在这种情况下,允许抛出可捕获异常所需的检查会减慢程序的速度,因此[]
运算符不会执行任何检查1。你得到了一个更快的程序,但你这个程序员必须保证程序永远不会超出范围。
std::vector::at
方法确实会检查并会引发异常,但通过使用 at
,您选择了一个稍微慢一些的程序。
1不要求任何检查是更好的表达方式。在这种情况下,MicroSoft 标准库实现的调试版本中的vector
实现确实默认检查并且“调试断言失败!”消息是直接结果。调试版本经过优化,使调试更容易,而且往往很慢。此检查不会在发布库中进行,因为发布版本针对性能进行了优化。
【讨论】:
以上是关于在 Visual Studio 2019 中处理异常的主要内容,如果未能解决你的问题,请参考以下文章
visual studio 2012 启动出现如下错误,怎么处理
Visual Studio 2019 缺少 SQL Server
NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包