我发现Visual C ++ 2010的自动突破异常功能在过去和今天非常有用我正在查看此对话框中的选项,并发现其中一个异常类型是“void”。这是什么意思?如果我选择这个,我会打破代码中抛出的任何异常吗?如果没有,什么样的throw语句会触发这种类型的断点?
我想更一般的后续问题是我在哪里可以找到关于此对话框及其所有选项的文档?
答案 0 :(得分:12)
关于它是如何工作的(正如MSalters所提到的),这只是关于不正确的命名。
实际上它当然应命名为 void*
。
但为什么它适用于int*
,const char*
等(实际上任何指针类型,包括指向用户定义类型的指针)?
好吧,我可以认为这与非常有趣的C ++异常处理问题有关 - catch(void*)
异常处理程序实际捕获任何(cv兼容的)指针类型异常!
示例:
try
{
throw "Catch me if you can!";
}
catch(void* e)
{
// ...and I can!
std::cout << "Gotcha!" << std::endl;
}
这里我们抛出char*
(在Visual C ++中,字符文字是char*
,而不是const char*
)并通过void*
捕获它。它会起作用!
答案可以在C ++ Holy Standard中找到:
§15.3处理例外
15.3.3处理程序是E类型的异常对象的匹配,如果
...
处理程序的类型为cv1 T * cv2,E是一种指针类型,可以通过其中一个或两个转换为处理程序的类型 - 标准指针转换(4.10),不涉及到指向私有或受保护或模糊类的指针的转换
...
4.10表示标准指针转换包括转换为void*
:
4.10.2类型“指向cv T的指针”的prvalue,其中T是对象类型,可以转换为类型为“指针”的prvalue cv void“。
另请注意,Visual Studio调试器的工作方式类似,但不完全。不同之处在于它忽略了cv限定符。因此,“例外”对话框中的void
实际上意味着任何[any cv] void*
。 Catch处理程序不会忽略:
try
{
struct Throwee {};
const Throwee* t = nullptr;
throw t;
}
catch(void* e)
{
// Will be missed
std::cout << "Gotcha!" << std::endl;
}
catch(const void* e)
{
// Will be catched
std::cout << "Gotcha const!" << std::endl;
}
答案 1 :(得分:4)
我发现在投放void*
,int*
或char const*
时,它会中断,而不是int
。
答案 2 :(得分:0)
这可能是catch(...)的设置。传播throw;
语句。