好的,所以我一直在关注C ++指南,最近我进入了关于异常处理的部分。 我无法使用我的任何代码 - 这一切都会对以下错误产生一些变化;
terminate called after throwing an instance of 'char const*'
其中" char const *"将是我投掷的任何类型。
我ctrl-c,ctrl-v'来自指南的示例代码,并运行它以查看错误是我的错,或者是否还有其他事情发生。它产生了与我的代码相同的错误(上面)。
这是指南中的代码;
#include "math.h" // for sqrt() function
#include <iostream>
using namespace std;
// A modular square root function
double MySqrt(double dX)
{
// If the user entered a negative number, this is an error condition
if (dX < 0.0)
throw "Can not take sqrt of negative number"; // throw exception of type char*
return sqrt(dX);
}
int main()
{
cout << "Enter a number: ";
double dX;
cin >> dX;
try // Look for exceptions that occur within try block and route to attached catch block(s)
{
cout << "The sqrt of " << dX << " is " << MySqrt(dX) << endl;
}
catch (char* strException) // catch exceptions of type char*
{
cerr << "Error: " << strException << endl;
}
}
答案 0 :(得分:4)
始终抓住绝对 const
例外:catch (const char const* strException)
对它们进行更改(写入操作)既不是有意也不有用。甚至没有可能的堆栈本地副本。
虽然你所做的事情似乎并不是一个好主意。异常约定是这些应该实现std::exception
接口,它们可以以规范的方式捕获。符合标准的方式是
class invalid_sqrt_param : public std::exception {
public:
virtual const char* what() const {
return "Can not take sqrt of negative number";
}
};
double MySqrt(double dX) {
// If the user entered a negative number, this is an error condition
if (dX < 0.0) {
// throw exception of type invalid_sqrt_param
throw invalid_sqrt_param();
}
return sqrt(dX);
}
// Look for exceptions that occur within try block
// and route to attached catch block(s)
try {
cout << "The sqrt of " << dX << " is " << MySqrt(dX) << endl;
}
// catch exceptions of type 'const std::exception&'
catch (const std::exception& ex) {
cerr << "Error: " << ex.what() << endl;
}
注意:强>
对于传递给函数的无效参数,已经设置了标准异常。或者你可以简单地做
double MySqrt(double dX) {
// If the user entered a negative number, this is an error condition
if (dX < 0.0) {
// throw exception of type invalid_sqrt_param
throw std::invalid_argument("MySqrt: Can not take sqrt of negative number");
}
return sqrt(dX);
}
答案 1 :(得分:2)
正如评论中所提到的那样,您并没有抓住const char*
,而是char*
。
如果您将相应的行更改为const char*
,则其效果与this example相同。
您可以像this example一样添加catch(...)
块,但我强烈建议反对,因为它可以掩盖您首先未考虑的实际问题
样式说明:
#include "math.h"
而是#include <cmath>
using namespace std;
(只是指出了这一点,以防&#34;教程&#34;没有&#39;)