84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
平常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無關。