平常debug出的exception(如圖)和人為試圖判斷使用者輸入對錯的try throw異常有什麼本質區別嗎? 或者說平常談及c 的異常機制是不是包括前者,還是只是單純的指後者?
#上面提到的第一種異常是由什麼來判斷的, 例如圖裡的accedd violation, 是編譯器進行的判斷還是ide的其他工具?
@依雲 說的有道理,我做補充
c++的異常只能捕獲由c++拋出的異常。簡單來說,即它只能catch它自己(不限於你寫的程式碼,還包括運行庫)throw的異常。
實際上c++拋出的異常並不算真正的異常,因為他只是被定義的,可預測的。真正的異常只有執行過後才被cpu觸發,也就是硬體拋出的例外。
硬體不會直接理會c++,它會交給作業系統去處理。鑑於作業系統的不同,對異常的處理也是不一致的————但他們都不會交給上層語言。
以相對完善的windows異常處理為例,它會
交給調試器(進程必須被調試)
執行VEH
執行SEH
TopLevelEH(進程被調試時不會被執行)
交給調試器(上面的異常處理都說處理不了,就再次交給調試器)
呼叫異常埠通知csrss.exe
記憶體讀取違例,是由硬體判斷,然後交由作業系統處理的。 (我不太懂 C++,不過這不像是 C++ 的異常,而是 Windows 拋出的異常。)
沒有get到你的點,有些庫裡就自帶的異常類,也可以自訂異常類,最後都繼承自std::exception,本質上沒啥區別。還有就是這個是執行時期的異常,跟編譯器還有ide無關。
std::exception
@依雲 說的有道理,我做補充
c++的異常只能捕獲由c++拋出的異常。簡單來說,即它只能catch它自己(不限於你寫的程式碼,還包括運行庫)throw的異常。
實際上c++拋出的異常並不算真正的異常,因為他只是被定義的,可預測的。真正的異常只有執行過後才被cpu觸發,也就是硬體拋出的例外。
硬體不會直接理會c++,它會交給作業系統去處理。鑑於作業系統的不同,對異常的處理也是不一致的————但他們都不會交給上層語言。
以相對完善的windows異常處理為例,它會
交給調試器(進程必須被調試)
執行VEH
執行SEH
TopLevelEH(進程被調試時不會被執行)
交給調試器(上面的異常處理都說處理不了,就再次交給調試器)
呼叫異常埠通知csrss.exe
記憶體讀取違例,是由硬體判斷,然後交由作業系統處理的。 (我不太懂 C++,不過這不像是 C++ 的異常,而是 Windows 拋出的異常。)
沒有get到你的點,有些庫裡就自帶的異常類,也可以自訂異常類,最後都繼承自
std::exception
,本質上沒啥區別。還有就是這個是執行時期的異常,跟編譯器還有ide無關。