C++ 为什么不是';tc++;捕获此异常?

C++ 为什么不是';tc++;捕获此异常?,c++,exception,C++,Exception,我有以下代码用于从缓冲区数组中提取字符串。 它很好用。但是,length变量是在运行时确定的,因此如果它超出了界限,就会发生异常。当然,可以轻松地调整代码,以检查长度变量(相对于偏移量变量)是否在边界内。尽管我很好奇为什么下面的代码不起作用,因为异常似乎在try-catch语句中出现(并被调试器捕获) 在Windows 7 64位上运行,MSVCR已编译。访问缓冲区数组超出边界是未定义的行为。在这种情况下,不需要抛出C++异常。尝试在Try块外实例化字符串,您将确定是否引发异常。我认为术语“异常

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


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

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

我认为术语“异常”让您感到困惑。当我们谈论
catch
可以捕获的异常时,我们不是指一般计算机科学意义上的“异常”。我们特别指出C++异常,它是用<代码>抛出<代码>操作> < /p> 您没有抛出异常的代码,为什么希望捕获异常?如果您想在这种情况下抛出异常,您必须编写代码来执行


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

由于程序访问的内存位置对系统的进程无效,程序可能会导致<代码>错误>代码>。例如,取消引用空指针(总是错误)或超出堆中变量的边界(不总是错误,取决于页面边界)。由CPU检测到这些代码>故障/代码>,是一种与C++中的TIG/catch捕获的异常不同的机制,它们是语言的一部分,由编译器和语言运行库实现。
在您的情况下,由于您使用的是MSVC,因此您可以访问该语言的一个扩展,该扩展允许您同时捕获“try”和“except”功能,您可以阅读有关MSVC的更多信息。

缓冲区的类型是什么?如果是<代码> char []/Cuth>,则没有边界检查,并且<代码> STD::String 的构造函数也不知道结束在哪里。您想知道VisualC++中是否有什么东西可以帮助您完成这项工作?因为标准C++没有做那种检查。调试器捕获的是什么?我知道了。我收到消息“Program.exe中0x512FCDB1(msvcr100d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0x024fffff”,并被前两个字误导。谢谢你澄清这一点。
try
{
    string value(&buffer[offset], length);
    // ...
}
catch (exception& e)
{
    // ...
}
catch (...)
{
    // ...
}