扩展 std::exception 类:程序不会执行适当的 catch handler
Extending the std::exception class : program won't execute the appropriate catch handler
我从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的命令行中指定任何类型的软件异常都可以离开我编写的任何函数。但如何?我将为这个新话题发布一个新问题。
感谢所有为我着想的人。
- 为什么catch中的代码没有被执行
- catch框架有没有办法比较流或文件
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 不能将重载比较运算符与 Catch 测试一起使用
- #pragma 警告不适用于 catch 语句
- ESP32-AsyncUDP own handler function for udp.onPacket
- 我可以使用 try catch 语句来捕获任何错误而不是具体错误吗?
- 在大型应用程序的main上使用try-catch
- RapidXML 节点在 try catch 块中具有正确的值,但它在块外为 nullptr
- 提取 try-catch 时出现运行时错误
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- C++ Catch 是否有类似 NUnit 的测试用例的东西,具有多个参数/输入选项
- 何时删除 try-catch 块中的指针
- 抛出多个异常时,catch 块执行的顺序是什么,为什么?
- 扩展 std::exception 类:程序不会执行适当的 catch handler