扩展std :: exception类:程序不会执行适当的catch处理程序

时间:2011-12-05 21:38:17

标签: c++ exception gcc exception-handling

我从std :: exception派生了一个类:

class exc : public std::exception
{
public:
    exc(const text::_char *) throw();
    exc(const exc &) throw();
    virtual ~exc() throw();

    text::_char *m_what;
};

我有两个包装函数来抛出我的异常类型:

PS:dbg_out指的是std :: cout。 text是std :: basic_string<<的后代char>>。

void throw_exception(const text::_char *p_format, ...)
{
    va_list l_list;

    text l_message;

    va_start(l_list, p_format);
    l_message.format_va(p_format, l_list);
    va_end(l_list);
    throw exc((const text::_char *)l_message);
}

void throw_exception_va(const text::_char *p_format, va_list p_list)
{
    text l;
    exc l_exc((const text::_char *)l.format_va(p_format, p_list));

    dbg_out << l_exc.m_what;
    throw l_exc;
}

主要功能:

int main(int, char **)
{
    try
    {
        throw_exception("hello world!");
        return 0;
    }
    catch(const std::exception &p)
    {
        return 0;
    }
}

我的程序崩溃了这条消息:

hello world!
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

我使用gcc编译器(最新的MinGW版本)

我的程序没有进入main函数中的catch处理程序。它不会调用类exc的复制构造函数。它看起来像是由gcc生成的代码,不会将exc识别为std :: exception的后代。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我打赌你的问题就在这条线上:

throw exc((const text::_char *)l_message);

您提及text源自basic_string<char>。从basic_string<char>const char*没有受支持的演员表。因此,除非您在派生类中提供自己的转换运算符,否则您将在此处处于未定义/未指定的行为。尝试将以上行更改为:

throw exc(l_message.c_str());

答案 1 :(得分:0)

这是我在十二月写的。第五:

exc的构造函数复制的内存在复制之前已被删除。访问违规保证!我已经学习了另外一个关于这种精彩的编程语言的东西(当你'抛出exc(some_deleted_memory)'时幕后会发生什么。

&LT;&LT;十二月底第五&GT;&GT;

这不是真正的问题。真正的问题是gcc-compiler(带选项:)

    gcc -fexceptions -Wnoexcept -fno-use-cxa-get-exception-ptr -include .\pch.h -g3 *.cpp 
    -l libstdc++ -o vlb.exe

不喜欢抛出函数声明的'throw()'规范的异常。当'throw_exception()'声明为

    void throw_exception() throw(const std::exception &);
一切都很好。

我一直认为(至少是软件)异常可能在每个调用语句中发生,并且堆栈展开过程必须能够处理它。我不喜欢我必须指定哪种类型的异常可能为我编写的每个函数留下函数的想法。

不知何故,我应该能够指定任何类型的软件异常都可以在gcc的命令行上留下我写的任何函数。但是怎么样?我将为这个新主题发布一个新问题。

感谢所有想过我的人。