以下程序:
int DivZero(int, int, int);
int main()
{
try {
cout << DivZero(1,0,2) << endl;
}
catch(char* e)
{
cout << "Exception is thrown!" << endl;
cout << e << endl;
return 1;
}
return 0;
}
int DivZero(int a, int b, int c)
{
if( a <= 0 || b <= 0 || c <= 0)
throw "All parameters must be greater than 0.";
return b/c + a;
}
使用char * e将提供
投掷后终止调用 'char const *'的实例
根据C++ Exception Handling,解决方案是使用 const char * 。
function (const char *) vs. function (char *)的进一步阅读说
“String”的类型是
char*', not
const char *'(这是我认为的C讨论......)
关于Stack Overflow char* vs const char* as a parameter的补充阅读告诉我区别。但它们都没有解决我的问题:
该错误的解决方案是使用 const char * e 。
即使是const字符串* e也不起作用。 (只是为了测试...)
有人可以解释一下吗?谢谢!
顺便说一句,我在UCCntu上,由GCC编译,在Eclipse上。
答案 0 :(得分:21)
您链接到“String”的电子邮件错误(并且令人困惑)。
基本上:
char*
是指向无界字符数组的指针。传统上,如果它包含一组有效字符后跟\0
,我们认为这样的数组是C字符串。数组的大小没有限制。
const char*
是指向不可变字符的无界数组的指针。
string*
是指向std::string
对象的指针,完全不同。这是一个封装字符串的智能对象。使用std::string
代替C字符串可以让你的生活更容易,即使他们有一些粗糙的边缘和许多讨厌的陷阱;他们非常值得研究,但他们与这个问题无关。
"String"
是一个特殊的表达式,它返回指向特定C字符串的const char*
(注意:这实际上不是真的,但这是一个简化,让我能够简洁地回答这个问题)。 / p>
char*
可自动转换为const char*
,但反之亦然。请注意,旧的C ++编译器对类型规则有一个特殊的例外,允许您这样做:
char* s = "String";
...没有产生类型错误;这是为了C兼容性。现代C ++编译器不允许你这样做(比如最近的gccs)。他们要求:
const char* s = "String";
因此。这里的问题是你有:
throw "All parameters must be greater than 0.";
...但是你试图抓住它:
catch(char* e)
这不起作用,因为throw抛出const char*
,不能强制转换为catch中指定的类型,因此它不会被捕获。
这就是将捕获更改为:
的原因catch (const char* e)
......让它发挥作用。
答案 1 :(得分:18)
为什么你要扔掉和捕捉字符串呢?
您应该抛出并捕获异常,例如std::runtime_error
你的问题的答案是,无论何时你在代码中的引号中插入一个字符串,它都会返回一个空的终止const char *
你的代码不能像上面那样工作的原因是因为它是错误的类型,因此catch不会捕获你正在抛出的东西。你正在抛出一个const char *。
char数组中的字符数超出堆栈/堆的大小没有限制。如果你指的是你发布的例子,那个人已经创建了一个固定大小的数组,所以它们是有限的。