Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我抛出字符串文本,我应该捕获什么类型? 我在C++中用G++编写了一个非常简单的应用程序,我尝试抛出一些原始字符串作为例外(是的,我知道,这不是一个好的练习)。_C++_Linux_Exception_G++ - Fatal编程技术网

如果我抛出字符串文本,我应该捕获什么类型? 我在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)