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

时间:2013-02-12 10:46:38

标签: c++ exception

我有以下代码用于从缓冲区数组中提取字符串。 它工作正常。但是, length 变量是在运行时确定的,因此如果它超出范围,则会发生异常。当然,可以轻松调整代码以检查 length 变量(与 offset 变量相关)是否属于边界内。虽然我很好奇为什么以下代码不起作用,因为异常似乎飞过try-catch语句(并被调试器捕获)。

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

我认为“例外”一词让你感到困惑。当我们谈到catch可以捕获的异常时,我们并不是指一般计算机科学意义上的“异常”。我们特指的是throw操作抛出的C ++异常。

你没有抛出异常的代码,你为什么要抓一个?如果您想在这种情况下抛出异常,则必须编写代码来执行此操作。

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

答案 2 :(得分:1)

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

在您使用MSVC的情况下,您可以访问允许您同时捕获__try和__except工具的语言的扩展,您可以阅读有关MSVC try-except Statement here的更多信息。