在 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 2019 - SSDT

visual studio 2012 启动出现如下错误,怎么处理

Visual Studio 2019 缺少 SQL Server

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包