我正在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。我的问题是:如果我不想使用静态强制类型转换,我应该捕获哪种类型?
Unknow error
std::string
char *
Error: not implemented
您需要使用char const*而不是char*。任何东西都std::string不会,也char*不会抓住。
char const*
char*
关于匹配的类型,捕获具有受限制的规则。规范说(其中“ cv”表示“常量/易失性组合”,或都不表示)。
如果满足以下条件,则处理程序匹配类型为E的异常对象: 处理程序的类型为cv T或cv T&,并且E和T是同一类型(忽略顶级cv限定词),或者 处理程序是cv T或cv T&类型,并且T是E的明确公共基类,或者 处理程序的类型为cv1 T * cv2,E是指针类型,可以通过以下任意一个或全部将其转换为处理程序的类型 标准指针转换(4.10),不涉及对指向私有或受保护或模糊类的指针的转换 资格转换
如果满足以下条件,则处理程序匹配类型为E的异常对象:
处理程序的类型为cv1 T * cv2,E是指针类型,可以通过以下任意一个或全部将其转换为处理程序的类型
字符串文字的类型为char const[N],但抛出一个数组将使该数组衰减,并实际上抛出一个指向其第一个元素的指针。因此,您不能用a捕获抛出的字符串文字char*,因为在匹配时,它需要将匹配char*到a char const*,这将丢弃const(仅允许使用条件转换来 添加 const)。char*仅在需要专门转换字符串文字时,才考虑对字符串文字进行特殊转换。
char const[N]