C++ 我得到的是分段错误而不是异常

C++ 我得到的是分段错误而不是异常,c++,exception,exception-handling,segmentation-fault,try-catch,C++,Exception,Exception Handling,Segmentation Fault,Try Catch,在下面的代码中,在第一次迭代中,我得到一个异常,在第二次迭代中,我得到一个分段错误,没有打印错误消息。似乎没有捕捉到异常: int i = 0; while(i++ < 10) { try { cout << "Iteration: " << i << endl; // Code... cout << "OK" << endl; } catch(...) {

在下面的代码中,在第一次迭代中,我得到一个异常,在第二次迭代中,我得到一个分段错误,没有打印错误消息。似乎没有捕捉到异常:

int i = 0;
while(i++ < 10)
{
   try {
      cout << "Iteration: " << i << endl;
      // Code...
      cout << "OK" << endl;
   }
   catch(...)
   {
      cerr << "Error message" << endl;
      continue;
   }
}

Output:
Iteration 1
Error message
Iteration 2
Segmentation fault
inti=0;
而(i++<10)
{
试一试{

cout您无法捕获那样的分段错误。此错误通常是不可恢复的,并且通常的try-catch无法处理。这意味着发生了非常的错误,可能是堆栈损坏或类似的错误。请尝试使用检测分段错误的原因。

catch
子句捕获b引发的异常在代码C++中(在任何健全的C++实现中),它们都是操作系统或硬件检测到的“强>不/强”catch错误,否则会造成编写异常安全代码的难度太大。软件中的数据,但处理器检测到您试图访问无效内存(或以无效方式访问内存-例如写入受写保护的内存、执行不应执行的内存等),则无法“捕获”使用
try/catch
,它旨在捕获引发异常的软件。它们都称为异常,但它们起源于系统软件/硬件的不同级别

从技术上讲,您可以使用
SIGSEGV
的信号处理程序捕获SEGFULT。但是,正如Ivaylo所解释的,如果您遇到SEGFULT,通常不允许“重试”。允许
SIGSEGV
的信号处理程序
longjmp
退出
,但不应该只是返回

请在此处阅读有关信号的更多信息:


典型C++异常(<代码>投掷< /代码>)可无问题重试(当然,同样的异常可能会再次抛出。

分段错误不会被
try catch
捕获。您应该使用调试器来捕获它。我非常确定它一定在您的
//code…
中。无法在您发布的内容中发现分段错误点…我通过编写
if(i==1)来复制您的输出)抛出0;否则i=*(int*)0;
但这不是您的
//code
所做的,是吗?当取消引用无效指针(null或指向未分配区域)时也会发生Segfaults,这是一个非常常见的错误,与堆栈损坏没有什么区别。