什么是不可捕获的例外

Art*_*rez 3 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
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 7

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

可以拦截信号,但这不是您应该自己处理的信号.如果您的程序导致分段错误,那么它就有一个错误,毫无疑问.

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

不要试图通过处理信号来解决这个问题.不要通过确保修复此程序不会导致分段错误.