为什么C++没有捕获此异常?

Why isn't C++ catching this exception?

本文关键字:异常 C++ 为什么      更新时间:2023-10-16

我有以下代码用于从缓冲区数组中提取字符串。它运行良好。但是,length变量是在运行时确定的,因此如果超出界限,就会发生异常。当然,可以很容易地调整代码,以检查长度变量(相对于偏移的变量)是否在边界内。尽管我很好奇为什么下面的代码不起作用,因为异常似乎在try-catch语句中运行(并被调试器捕获)。

try
{
    string value(&buffer[offset], length);
    // ...
}
catch (exception& e)
{
    // ...
}
catch (...)
{
    // ...
}

在Windows 7 64位上运行,MSVCR已编译。

越界访问buffer数组是未定义的行为。在这种情况下,不需要抛出C++异常。尝试在Try块外实例化字符串,您可以确定是否引发了异常。

我认为"异常"一词会让您感到困惑。当我们谈论catch可以捕获的异常时,我们并不是指一般计算机科学意义上的"异常"。我们特别指的是throw操作引发的C++异常。

您没有抛出异常的代码,为什么希望捕获一个异常?如果你想在这种情况下抛出一个异常,你必须编写代码来完成

有时,我看到程序员希望能够捕捉到,例如,除以零。虽然这是一般计算机科学意义上的一个例外,但它不是C++例外,除非你有一些代码在被零除时创建C++异常并抛出它。

您的程序可能会因为访问系统知道对您的进程无效的内存位置而导致fault,例如取消引用NULL指针(总是错误)或超出堆中变量的边界(不是总是错误,取决于页面边界)。这些faults是由CPU检测到的,与C++中使用try/catch捕获的异常是不同的机制,它们是语言的一部分,由编译器和语言运行库实现。

在您的情况下,由于您使用的是MSVC,您可以访问该语言的扩展,该语言允许您同时捕获__try和__except功能,您可以在此处阅读有关MSVC try-except语句的更多信息。