关于C ++异常处理/投掷的澄清

时间:2010-07-12 09:51:16

标签: c++ exception-handling

请考虑以下代码:

try {
   int *i = NULL;
   i[100] = 20;
catch (...) {
   std::cout << "Exception Caught";
}

运行此代码时,它会崩溃(显然,访问NULL指针)。 虽然,在调试模式下,Visual Studio会声明有关写访问冲突的未捕获异常。也可以理解。

我期待在这里捕获一个例外,但没有一个例外。
我的结论是,没有例外被抛出。
那么为什么VS警告未被捕获的异常呢?

这个问题都是在我想要保护自己免受其他程序员编写代码的时候开始的,并希望用try-catch包含对其函数的调用,假设他可能正在做一些访问冲突。但是,如果我只能捕捉到被抛出的异常,那我就搞砸了。 我可能有的唯一其他解释是,这是因为某种项目或编译器配置。 我在一个新的C ++控制台应用程序VS2005中运行它。

由于

6 个答案:

答案 0 :(得分:5)

为了使catch(...)能够捕获所谓的结构化异常,您需要在项目设置中启用它。

答案 1 :(得分:3)

访问冲突不是C ++异常,并且无法被catch运算符捕获。 “输出”窗口中未处理的异常消息并不意味着这是C ++异常。为C ++异常和任何其他异常(如访问冲突)生成第一次机会和未处理的异常消息。 __try - __except块可以捕获非C ++异常。

答案 2 :(得分:2)

您要捕获的异常是SEH异常。您可以使用__try,__ except,__ finalally关键字

答案 3 :(得分:1)

C ++没有指定数组边界检查,也没有。此实例中的“错误”是运行时系统将分段错误报告为异常。

答案 4 :(得分:1)

C ++异常仅处理由“throw”语句创建的异常。它们与机器异常无关(如访问无效内存)。然而,Windows引入了n C ++ - 类似于异常的方案来处理机器错误,称为“结构化异常处理”。不幸的是,它与C ++不匹配,因为堆栈展开过程不会调用延迟的析构函数。

因此,他们添加了一种将机器异常映射到C ++异常的方法:您可以提供一个回调函数,该函数在发生机器异常时调用,您可以从该回调中抛出C ++异常(与信号处理程序不同)并且< em> 异常用于展开堆栈,这次采用C ++方式。 _set_se_translator()设置此回调,这是MSDN中的相应页面:

http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx

答案 5 :(得分:0)

与Java不同,取消引用空指针时不会抛出C ++异常。