如果我抛出字符串文本,我应该捕获什么类型? 我在C++中用G++编写了一个非常简单的应用程序,我尝试抛出一些原始字符串作为例外(是的,我知道,这不是一个好的练习)。
我有以下代码(简化):如果我抛出字符串文本,我应该捕获什么类型? 我在C++中用G++编写了一个非常简单的应用程序,我尝试抛出一些原始字符串作为例外(是的,我知道,这不是一个好的练习)。,c++,linux,exception,g++,C++,Linux,Exception,G++,我有以下代码(简化): intmain() { 尝试 { 抛出“未执行”; } 捕获(标准::字符串和错误) { cerr尝试将const添加到正在捕获的类型中,const char*(可能是const char*const)。字符串文本的确切类型是一个const字符数组(const char[15],因为包含NUL终止符)。数组在抛出时衰减为const char*,这与长度无关。您需要使用char const*而不是char*捕获它。类似std::string或char*的任何东西都不会捕获它
intmain()
{
尝试
{
抛出“未执行”;
}
捕获(标准::字符串和错误)
{
cerr尝试将const
添加到正在捕获的类型中,const char*
(可能是const char*const
)。字符串文本的确切类型是一个const字符数组(const char[15]
,因为包含NUL终止符)。数组在抛出时衰减为const char*
,这与长度无关。您需要使用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]
,但抛出数组将使数组衰减,并实际抛出指向其第一个元素的指针。因此,您无法通过char*
捕获抛出的字符串文字,因为在匹配时,它需要将char*
与char const*
匹配,这将丢弃一个常量(限定转换仅允许添加常量)。仅当需要专门转换字符串文本时,才考虑将字符串文本特殊转换为char*
。类型应为const char[15]
或const char*
但是,虽然该语言不禁止您抛出任何类型值,但您不应该将本机数据类型作为异常引发。相反,您希望引发一个std::exception()
实例,或者创建自己的异常类。问题是您试图捕捉的是常量。以下操作将起作用:
捕获(常量字符*错误)
{
cerr字符串文本的类型是char-const*
。提供了到char*
的(不推荐的)转换,以便与现有代码向后兼容(但您仍然必须将其视为const
——任何修改尝试都会导致错误)
因此,这样的代码应该可以工作:
#include <iostream>
using namespace std;
int main()
{
try
{
throw "not implemented";
}
catch(char const *error)
{
cerr<<"Error: "<<error<<endl;
}
return 0;
}
#包括
使用名称空间std;
int main()
{
尝试
{
抛出“未执行”;
}
捕获(字符常量*错误)
{
cerr查看标准规范的第2.14.5节,它在3页上处理字符串文本的类型和种类。不要做你开始做的事情,只说:
throw std::exception("not implemented");
连同适当的
catch (std::exception& pEx)
这种“正常”的方法有什么问题吗?或者我个人的最爱:char-const*
@Martin:说英语的人似乎因为某种原因对后缀位置的const
有些困难:)愚蠢的问题:有人在真正的代码中抛出不是从std::exception
继承的东西吗?(除了自杀例外,不,这不是嘲笑:p)
catch (std::exception& pEx)