什么是不可捕获的例外

时间:2013-03-15 23:32:16

标签: c++ exception try-catch

gcc(GCC)4.5.3

GNU gdb(GDB)7.5.50.20130309-cvs(cygwin-special)

Netbeans 7.3

我在代码中捕获SIGSEGV,Segment Fault Exception时遇到了一些麻烦。 try-catch没有捕获它(下面的代码)。这是一个不可捕获的例外吗?有没有办法抓住它? (当然)我做错了什么?

本领域

string SlipStringOp::dump(const SlipCell& X) const {
   stringstream pretty;
   PTR ptr = *getPtr(X);

   pretty << "[string   ] " << dumpLink(X)  << " = " 
           << setfill('0') << setw(8) << hex << ptr
           << " -> ";
   try {
      pretty << ptr->dump();
   } catch(exception& e) {
      pretty << e.what();
      postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
   } catch(...) {
      postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");   
   }
   return pretty.str();
}; // string SlipStringOp::dump(const SlipCell& X) const

3 个答案:

答案 0 :(得分:7)

SIGSEGV也不例外;这是一个信号。访问无效的内存地址称为分段错误。当您的程序执行此操作时,操作系统将向您的进程发送SIGSEGV信号。此信号的默认处理程序将立即终止该过程。

can intercept a signal,但这不是你应该自己处理的信号。如果您的程序导致分段错误,那么它就有一个错误,毫无疑问。

如果您已将分段错误隔离到pretty << ptr->dump();行,我猜测问题可能是ptr未指向有效对象。或者,dump功能正在做坏事。

不要尝试通过处理信号来解决此问题。 通过确保您的程序不会导致分段错误来解决此问题。

答案 1 :(得分:1)

这里有两个问题。首先,你为什么要获得SIGSEGV?这里可能没有足够的代码告诉我们,但是你是否要求ptr-&gt; dump()以递归方式调用相同的函数?如果是这样,你有无限递归,这就是导致seg错误。

第二个问题是你如何捕获信号,并且之前的响应者已经回答了这个问题。

答案 2 :(得分:0)

使用throw表达式抛出异常。您在catch子句中捕获异常。

通过拨打raise发出信号。您可以在引发异常之前通过安装处理程序来处理信号。

任何其他操作和交互都是系统特定的(即不可移植)。