是否必须在c ++中的catch块中传递参数?

时间:2016-09-06 18:15:10

标签: c++ try-catch

#include <iostream>
using namespace std;

int main() {

    int i=5;
    cout<<"here1";
    try
    {    if(i==5)
          throw ;
          cout<<"here2";
    }
    catch()
    {
      cout<<"here3"; 
    }

     cout<<"here4";
    return 0;
}

错误:')'令牌之前的预期类型说明符   抓住()         ^

4 个答案:

答案 0 :(得分:1)

你应该把它写成:

catch(...)

如果您想要捕获异常,无论它有什么类型。

答案 1 :(得分:1)

  

是否必须在c ++中的catch块中传递参数?

是的,是的。

catch()总是需要一个参数或至少一个省略号(与任何未知的异常类型匹配)。来自reference documentation

catch ( attr(optional) type-specifier-seq declarator ) 
      compound-statement    (1) 
catch ( attr(optional) type-specifier-seq abstract-declarator(optional) ) 
      compound-statement    (2) 
catch ( ... ) compound-statement  (3) 

这对应于throw语句总是需要一个类型(抛出)的事实。 catch块中的普通throw;语句会重新抛出当前捕获的异常。

也就是说,throw;语句(来自catch块的上下文)和示例中的catch()签名在编译器报告时无效。

答案 2 :(得分:0)

您可以使用省略号指定任何异常,这也不适用于读取访问冲突或写入访问冲突,并使用它如下:

#include <iostream>
using namespace std;

int main() {

    int i=5;
    cout<<"here1";
    try
    {    if(i==5)
          throw ;
          cout<<"here2";
    }
    catch(...) //'...' means anything, here any exception
    {
      cout<<"here3"; 
    }

     cout<<"here4";
    return 0;
}

我还建议使用这样的通用std::exception类:

catch (const std::exception& e)
{
    std::cerr << e.what();
}

答案 3 :(得分:0)

Catch-all处理程序,为任何异常激活

try { 
    /* */ 
} 
catch (...) { 
    /* */ 
}