C++中...的用途是什么?

4

我试图用谷歌搜索...,但是不出所料,谷歌将其忽略了。

我有这段代码:

try {

// some code
}

catch( ... ) {
// catch logic

}

我猜测...代表任何类型的异常,我是对的吗?还有其他用法吗?

是的,你说得对。 - OldProgrammer
@OldProgrammer,还有其他用途吗? - Moha the almighty camel
2
没错。[宝可梦异常处理。](http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html) - Mysticial
2
你是正确的。在函数原型的上下文中,还有另一种用法,这意味着调用者可以传递任意数量的参数。例如 void format(char* formatString, ...); 但不要搞错了,这被认为是 C 的遗留问题,而不是正式的 C++。 - syam
MSVC++使用这种语法来捕获操作系统异常,称之为_SEH_(结构化异常处理)。顺便说一句,这种用法颇具争议。 - rodrigo
2个回答

8

我知道三种用例:

  • 可变数量的参数,如'printf(const char* fmt, ...)'
  • 捕捉所有异常,如'catch(...)'
  • 可变模板,如'template < typename ...T >'和展开'T ...' (c++11)

还有一种我错过的,是预处理:可变宏


2

是的,你说得对,catch(...) 意味着捕获所有异常。但是最好通过const引用来捕获异常,就像这样:

catch(std::exception const & ex) 
{ 
//code here
} 

来自MSDN的备注部分:

备注:

try子句后面的代码是受保护的代码段。throw表达式会抛出(引发)异常。catch子句后面的代码块是异常处理程序,如果throw和catch表达式中的类型兼容,则捕获(处理)throw表达式抛出的异常。有关在catch块中匹配类型的规则列表,请参见_。如果catch语句指定省略号(...)而不是类型,则catch块处理任何类型的异常,包括C异常和系统或应用程序生成的异常,例如内存保护、除以零和浮点违规。由于catch块按程序顺序尝试,因此这样的处理程序必须是其try块的最后一个处理程序。谨慎使用catch(…);通常这样的catch块用于记录错误并在停止程序执行之前执行任何特殊清理。除非catch块知道如何处理捕获的特定异常,否则不要允许程序继续运行。

try {
   throw CSomeOtherException();
}
catch(...) {  // Catch all exceptions – dangerous!!!
   // Respond (perhaps only partially) to exception
   throw;       // Pass exception to some other handler
}

还有其他用途吗?

我见过的一个用法是在可变参数中使用,例如 'printf(const char* x, ...)'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接