如果我抛出一个字符串文字,我应该抓住什么类型?

Grz*_*nio 22 c++ linux g++ exception

我正在使用Linux下的g ++在C++中编写一个非常简单的应用程序,我试图将一些原始字符串作为异常(是的,我知道,这不是一个好的做法).

我有以下代码(简化):

int main()
{
  try
  {
    throw "not implemented";

  }
  catch(std::string &error)
  {
    cerr<<"Error: "<<error<<endl;
  }
  catch(char* error)
  {
    cerr<<"Error: "<<error<<endl;
  }
  catch(...)
  {
    cerr<<"Unknown error"<<endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

Unknow error上了控制台.但是,如果我将文字字符串静态转换为其中任何一个,std::string或者按预期char *打印Error: not implemented.我的问题是:如果我不想使用静态演员,我应该抓住什么类型?

Joh*_*itb 30

你需要用它来char const*代替它char*.既不喜欢std::stringchar*不会抓住它.

捕获限制了与其匹配的类型的规则.规范说(其中"cv"表示"const/volatile组合"或两者都不是).

处理程序是E类型的异常对象的匹配项

  • 处理程序的类型为cv T或cv T&,E和T的类型相同(忽略顶级cv限定符),或者
  • 处理程序的类型为cv T或cv T&T是E的明确公共基类,或
  • 处理程序的类型为cv1 T*cv2,E是一种指针类型,可以通过其中一个或两个转换为处理程序的类型

    • 标准指针转换(4.10),不涉及到指向私有或受保护或模糊类的指针的转换
    • 资格转换

字符串文字具有类型char const[N],但抛出数组将衰减数组并实际抛出指向其第一个元素的指针.因此,您无法通过a捕获抛出的字符串文字char*,因为在它匹配时,它需要匹配char*a char const*,这将丢弃一个const(限定转换只允许添加 const).char*只有在需要专门转换字符串文字时才会考虑字符串文字的特殊转换.


luk*_*uke 10

尝试添加const你正在捕捉的类型const char* (可能const char* const).

  • `const char*`有效.http://ideone.com/6Fzid`const std :: string&`没有. (3认同)