Articles of 例外

默认析构函数的gccexception说明

class A { public: virtual ~A() { } }; class B : virtual public A { public: ~B() throw() {} }; class C : public B { }; int main(int argc, char * argv []) { return 0; } 该代码给出了以下错误: error: looser throw specifier for 'virtual C::~C()' error: overriding 'virtual B::~B() throw ()' 在我的debiantesting(gcc(Debian 4.6.0-10)4.6.1 […]

SWIG包装库中__cxa_allocate_exception期间的segfault

在为Ruby开发一个SWIG封装的C ++库的同时,我们发现在C ++代码中的exception处理期间出现了无法解释的崩溃。 我不确定重新创build问题的具体情况,但是在调用std::uncaught_exception ,首先发生了一些情况,然后在修改了一些代码之后,在构造exception的时候移动到__cxa_allocate_exception 。 GDB和valgrind都没有提供任何有关崩溃原因的信息。 我发现了几个类似的问题,包括: http://wiki.fifengine.de/Segfault_in_cxa_allocate_exception http://forums.fifengine.de/index.php?topic=30.0 http://code.google.com/p/osgswig/issues/detail?id=17 https://bugs.launchpad.net/ubuntu/+source/libavg/+bug/241808 压倒一切的主题似乎是情况的组合: AC应用程序链接到多个C ++库 在编译过程中使用了不止一个版本的libstdc ++ 通常,所使用的第二个C ++版本来自libGL的二进制实现 将库与C ++应用程序(仅C程序)链接时,不会发生此问题 “解决scheme”是明确地链接你的库与libstdc ++,也可能与libGL,强制链接的顺序。 尝试了很多与我的代码组合后,我发现唯一的解决scheme是LD_PRELOAD="libGL.so libstdc++.so.6" ruby scriptname选项。 也就是说,编译时链接解决scheme没有任何区别。 我对这个问题的理解是C ++运行时没有正确初始化。 通过强制链接的顺序,引导初始化过程,并且工作。 只有C应用程序调用C ++库时才会出现该问题,因为C应用程序本身并不链接到libstdc ++,也不初始化C ++运行时。 因为使用SWIG(或boost :: python)是从C应用程序调用C ++库的常用方法,所以在研究问题时经常出现SWIG。 有没有人能够更深入地了解这个问题? 有没有一个实际的解决scheme或只有解决方法存在? 谢谢。

如何在Linux C ++中捕获系统级exception?

下面的catch()不被调用: void test(void) { int i=1,j=0,k; try { k = i/j; } catch(…) { …handle it… } } 有没有办法来捕捉这种exception?

如果我抛出一个string,应该捕获什么types?

我在C ++中使用g ++编写了一个非常简单的应用程序,我试图抛出一些原始string作为exception(是的,我知道,这不是一个好习惯)。 我有以下代码(简化): int main() { try { throw "not implemented"; } catch(std::string &error) { cerr<<"Error: "<<error<<endl; } catch(char* error) { cerr<<"Error: "<<error<<endl; } catch(…) { cerr<<"Unknown error"<<endl; } } 我在控制台上遇到Unknow error 。 但是,如果我静态强制转换文字string为std :: string或char *它打印Error: not implemented预期方式Error: not implemented 。 我的问题是:如果我不想使用静态转换,那么我应该捕获什么types?

当我从本地Java方法抛出C ++exception时会发生什么?

假设我将Sun的JVMembedded到C ++应用程序中。 通过JNI,我调用一个Java方法(我自己的),它依次调用我在共享库中实现的本地方法。 如果这个本地方法抛出一个C ++exception,会发生什么? 编辑:编译器是gcc 3.4.x,jvm是sun的1.6.20。

C + + try-catch块不捕捉硬件exception

我正在检查visual studio 2013中的硬件和软件exception。我知道我可以通过设置“启用C ++exception”选项/ EHa来捕获硬件exception(是的,SEHexception)。 我试图捕捉以下例外: EXCEPTION_ARRAY_BOUNDS_EXCEEDED – 没有收到 EXCEPTION_ACCESS_VIOLATION – 抓到了 EXCEPTION_INT_OVERFLOW – 没有捕获 EXCEPTION_INT_DIVIDE_BY_ZERO – 被抓到 这是一个代码的例子。 try { a = std::numeric_limits<int>::max(); a += 5; } catch (…){ std::cout << "EXCEPTION_INT_OVERFLOW Exception Caught" << std::endl; exit(1); } try { int h = 0; b = b / h; } catch (…){ std::cout << […]