【问题标题】:What are non-catchable exceptions什么是不可捕获的异常
【发布时间】:2013-03-04 20:04:27
【问题描述】:

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

【问题讨论】:

  • 信号也不例外 :)
  • 有什么方法可以捕捉到信号?
  • 如果您真的想知道自己做错了什么,请先提供SSCCE
  • 是的,你可以捕捉到一个信号,但你不应该捕捉到这个。它代表您的代码中的一个错误,您应该修复它。
  • man signal: linux.die.net/man/2/signal 这会告诉你你需要知道什么。

标签: c++ exception try-catch


【解决方案1】:

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

can intercept a signal,但这不是你应该自己处理的信号。如果您的程序导致了分段错误,那么它肯定存在错误。

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

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

【讨论】:

    【解决方案2】:

    这里有两个问题。首先,您为什么要获得 SIGSEGV?这里可能没有足够的代码让我们知道,但是您对 ptr->dump() 的调用是否递归地调用了相同的函数?如果是这样,你有无限递归,这会导致段错误。

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

    【讨论】:

    • SIGSEGV 被引发,因为 ptr 指向一个已删除的对象。我希望通过捕获信号、发布适当的诊断消息并退出程序来自动处理。但是我可以(可能)只是解决问题,所以它不会“正常”发生,但是当它发生时软件用户会感到困惑。那好吧。另一天,另一次冒险,另一个临时错误处理程序。
    【解决方案3】:

    您使用throw 表达式引发异常。您在 catch 子句中捕获了一个异常。

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2011-11-14
      • 2020-07-31
      • 2013-07-19
      • 2013-08-14
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多