抛出异常错误'终止被叫......'

时间:2014-06-27 18:24:04

标签: c++

好的,所以我一直在关注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;
    }
}

2 个答案:

答案 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(...)块,但我强烈建议反对,因为它可以掩盖您首先未考虑的实际问题

样式说明:

  • 您不应该在{cp。
  • #include "math.h"而是#include <cmath>
  • 您在实际代码中should not use using namespace std;(只是指出了这一点,以防&#34;教程&#34;没有&#39;)
  • 这个教程闻起来,也许你应该找到另一个来源。