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

Extending the std::exception class : program won't execute the appropriate catch handler

本文关键字:catch handler 执行 exception std 程序 扩展      更新时间:2023-10-16

我从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版本)

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

我做错了什么?

我打赌你的问题在这一行:

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

你提到text是由basic_string<char>衍生而来的。没有从basic_string<char>const char*的支持铸型。除非你在派生类中提供你自己的转换运算符,否则你会进入未定义/未指定行为。尝试将上面的行改为:

throw exc(l_message.c_str());

这是我12月5日写的:

由exc的构造函数复制的内存在复制之前已被删除。访问违规保证!关于这门美妙的编程语言,我又学到了一件事(当你"抛出exc(some_deleted_memory)"时,在幕后发生了什么)。

& lt; & lt;12月5日结束>>

这不是真正的问题。真正的问题是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的命令行中指定任何类型的软件异常都可以离开我编写的任何函数。但如何?我将为这个新话题发布一个新问题。

感谢所有为我着想的人。