在Try-Catch块

时间:2017-09-27 17:34:17

标签: c++ string try-catch

在我的代码中,我想抛出一条消息,因此当发现输入时它会出现在屏幕上。我想这样做,但它没有用。所以,我希望你的帮助,看看是否有任何我不知道的事情,或者它是否是C ++中的非法行为。

这是我的代码中出现throw的地方(类函数成员实现)

//set the value of _s (seconds)
void Time::setSeconds(int s){
    if (s > 60 || s < 0)
        throw ("The value inside seconds has to be valid");
    else
        _s = s;
}

这就是我设法创建一个简单的try-catch块的方法

try{
    Time t(12,4,-12);

    t.printStandard();

    }catch(string const &a){
        cerr << a;
    }

但是,当程序运行时,我收到以下错误消息:

terminate called after throwing an instance of 'char const*'
Aborted (core dumped)

这显然不是预期的。

3 个答案:

答案 0 :(得分:0)

评论中的人帮我解决了这个问题:

当使用带有文本的throw时,编译器会将其视为const char*。在代码中,catch期望string const&。发生错误是因为,正如干杯和赫斯所说的那样。 - Alf

  

转换不被视为异常捕获

答案 1 :(得分:0)

您的 catch 语句需要指定const char*

catch(const char* a)
{
. . .
}

答案 2 :(得分:0)

你正在抛出一个char*指针,但试图抓住一个std::string对象。所以抛出的异常没有被抓住。未捕获的异常会导致调用terminate(),从而终止进程。

所以,你需要:

  • 开始std::string开始:

    void Time::setSeconds(int s){
        if (s > 60 || s < 0)
            throw std::string("The value inside seconds has to be valid");
        _s = s;
    }
    

  • 捕获const char*指针:

    catch(const char *a)
    

话虽如此,更好的方法是抛出standard STL exception class,例如std::out_of_range,例如:

#include <stdexcept>

//set the value of _s (seconds)
void Time::setSeconds(int s){
    if (s > 60 || s < 0)
        throw std::out_of_range("The value inside seconds has to be valid");
    _s = s;
}

...

try {
    Time t(12,4,-12);
    t.printStandard();
}
catch(std::exception const &a) {
    cerr << a.what();
}