为什么我应该在catch块中使用“const”?

时间:2013-07-20 08:04:20

标签: c++ exception-handling

try
{       
    if (isfull()==1)
        throw "full stack";
    else
        a[top++] = x;
}
catch (const char *s)
{
    cout<<s;
}

为什么我们应该在catch块中使用const?如果我不使用它,我会收到此错误:

terminate called after throwing an instance of 'char const*'  
Aborted (core dumped)

5 个答案:

答案 0 :(得分:8)

因为你正在抛出一个字符串文字,并且字符串文字与指向常量内存的指针相同,因此需要const

答案 1 :(得分:6)

更一般地说,这是因为你的catch块没有捕获你正在抛出的异常,如果你不使用const。

但是,抛出非异常类型被视为不良形式;考虑抛出一个std::runtime_error或从std :: exception派生的其他类型。您可以使用字符串构造大部分字符串,并从what()属性中获取消息。

你仍然应该通过const引用来捕获它们,以防止复制和修改被捕获的对象(在任何情况下这都不是一个有用的东西):

try
{
    throw runtime_error( "full stack" );
}
catch( const runtime_error & x )
{
    cout << x.what();
}
catch( const exception & x )
{
    // catch other exceptions derived from this base class.
}

答案 2 :(得分:2)

你的try块会抛出一个const类型字符串:“full stack”,这不是要在catch块中更改的。

在任何情况下,const char *都不能隐式地转换为char *。

如果catch接收char * s参数,s指向的内容可能会被s [...]赋值更改,这是不可接受的,导致内容(“full stack”)不变。

答案 3 :(得分:2)

因为您可以隐式地将less限定符的变量赋值给更多限定符 但你不能隐含地将MORE限定符的变量赋值给less限定符

例如

foo(char * p)
fooc(const char * p)

int main(int argc, char agrv[]) {
  const char* cp = "hello";
  char* p = new char[10];
  foo(cp); // ==> compilation error
  strcpy(p,  cp);
  fooc(p) // No probs assigning to a more qualified var
}

这就是为什么@Joachim Pileborg是对的:)。

答案 4 :(得分:0)

这不是那么简单。问题是在C ++中展示一些东西。 我们可以将“const char *”文字分配给“char *”

char* ss = "full stack"; //ok, although "full stack" looks like a const char*

const char* s2 = "full stack";
char* ss = s2 ; //not ok

用于处理C程序,C ++允许:char * ss =“full stack”; 顺便说说。在我的VS2005编译器中,没有任何事情发生(没有coredump)。

void main(){

    try
    {       
        throw "full stack";
    }
    catch (char *s)
    {
        std::cout << s <<std::endl;
    }
}