2013-03-15 52 views
3

海合會(GCC)4.5.3什麼是不開捕例外

GNU GDB(GDB)7.5.50.20130309-CVS(Cygwin的特)

的Netbeans 7.3

我有一些輕鬆沒收一個SIGSEGV,段錯誤異常,在我的代碼中。 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 
+5

信號不是例外:) – 2013-03-15 23:33:47

+0

任何方式來捕捉信號? – 2013-03-15 23:35:48

+0

如果你真的想知道你做錯了什麼,首先提供一個[SSCCE](http://meta.stackexchange.com/questions/22754/) – Nemo 2013-03-15 23:37:10

回答

7

SIGSEGV也不例外;這是一個信號。訪問無效的內存地址稱爲分段錯誤。當您的程序執行此操作時,操作系統將向您的進程發送SIGSEGV信號。該信號的默認處理程序將立即終止該過程。

can intercept a signal,但這不是你應該自己處理的信號。如果你的程序導致了分段錯誤,那麼它就有一個錯誤,毫無疑問。

如果您已將段錯誤隔離到pretty << ptr->dump();行,我猜測問題可能是ptr未指向有效的對象。或者,dump函數做的不好。

不要試圖通過處理信號來解決這個問題。 通過確保您的程序不會導致分段錯誤來解決此問題。

1

這裏有兩個問題。首先,你爲什麼得到一個SIGSEGV?這裏可能沒有足夠的代碼來告訴我們,但是您是否調用ptr-> dump()來遞歸調用相同的函數?如果是這樣,你有無限遞歸,並且導致seg錯誤。

第二個問題是您如何捕獲信號,並且已被以前的響應者回答。

+0

由於ptr指向已刪除的對象,SIGSEGV正在提出。我希望能夠通過捕捉信號,發佈適當的診斷信息並退出程序來自動處理。但是我可以(可能)只是修復這個問題,所以它不會'正常'發生,但是當軟件用戶確實發生時就會感到困惑。好吧。另一天,另一個冒險,另一個特設的錯誤處理程序。 – 2013-03-16 04:43:46

0

您用throw表達式拋出異常。您在catch子句中發現了異常。

您通過致電raise發出信號。通過在引發異常之前安裝處理程序來處理信號。

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