【问题标题】:C++ ExceptionHandeler: terminate ist always calledC++ 异常处理程序:终止它总是被调用
【发布时间】:2016-05-20 13:08:37
【问题描述】:

我刚开始在 C++ 中使用异常,但每次调用异常时,我的程序都会终止:

在抛出 'MyException1' 的实例后调用终止

what(): Hier koennte Ihre Werbung stehen

我不知道为什么。 请注意,我必须使用 C++03,因为我正在为 QNX 系统编程。

我的异常类:

using namespace std;
#include <exception>

class Exception : public exception
{
public:
    Exception(const char* msg): msg_((char*)msg) {};

    virtual const char* what() const throw()
    {
        return msg_;
    }

    virtual ~Exception() throw(){};

private:
    char* msg_;
};

class MyException1 : public Exception
{
public:
    MyException1(const char* message):Exception(message){}
};

抛出和捕获异常的类:

using namespace std;
#include "ExceptionUseExample.h"
#include <iostream>

void ExceptionUseExample::doSomethingElse() throw()
{
    throw MyException1("Hier koennte Ihre Werbung stehen");
}


void ExceptionUseExample::doSomething()
{
    try
    {
        doSomethingElse();
    }
    catch (MyException1& e)
    {
        cerr << "catched MyException1: " << e.what() << endl;
    }

}

【问题讨论】:

    标签: c++ exception try-catch


    【解决方案1】:

    问题(如果我没记错的话)出在doSomethingElse();您将其声明为throw(),因此您声明它不会引发异常。抛出异常,它会杀死程序。

    您应该删除throw() 或添加抛出异常的类型;有点像

    void doSomethingElse() throw(MyException1)
    

    void doSomethingElse() throw(Exception)
    

    顺便说一句,我向您报告另一个危险点(即使,如果我没记错的话)。

    Exception 的构造函数接收指向char 的指针并将其复制到类的成员。但是,当您使用 (what()) 时,谁能确保它指向有效(已分配)的内存区域? 我想你应该复制指出的区域。

    ps:对不起,我的英语不好。

    【讨论】:

    • 谢谢。我很快就会尝试。
    • 我强烈建议您在内部使用 std::string 并为 what() 返回 str.c_str()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多