一尘不染

如果我抛出字符串文字,应该捕获哪种类型?

linux

我正在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;
  }
}

然后我进入Unknow error控制台。但是,如果我将文字字符串静态转换为其中一个,std::string或者按预期char *打印Error: not implemented。我的问题是:如果我不想使用静态强制类型转换,我应该捕获哪种类型?


阅读 228

收藏
2020-06-03

共1个答案

一尘不染

您需要使用char const*而不是char*。任何东西都std::string不会,也char*不会抓住。

关于匹配的类型,捕获具有受限制的规则。规范说(其中“ cv”表示“常量/易失性组合”,或都不表示)。

如果满足以下条件,则处理程序匹配类型为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*仅在需要专门转换字符串文字时,才考虑对字符串文字进行特殊转换。

2020-06-03