vc try catch捕捉所有異常的問題

來源:互聯網
上載者:User

try{} catch(…){} 以前都是用try{} catch(…){}來捕獲C++中一些意想不到的異常, 今天看了Winhack的文章才知道,這種方法在VC中其實是靠不住的。例如下面的代碼: try { BYTE* pch ; pch = ( BYTE* )00001234 ; //給予一個非法地址 *pch = 6 ; //對非法地址賦值,會造成Access Violation 異常 } catch(...) { AfxMessageBox( "catched" ) ; } 這段代碼在debug下沒有問題,異常會被捕獲,會彈出”catched”的訊息框。 但在Release方式下如果選擇了編譯器代碼最佳化選項,則VC編譯器會去搜尋try塊中的代碼, 如果沒有找到throw代碼, 他就會認為try catch結構是多餘的, 給最佳化掉。 這樣造成在Release模式下,上述代碼中的異常不能被捕獲,從而迫使程式彈出錯誤提示框退出。那麼能否在release代碼最佳化狀態下捕獲這個異常呢, 答案是有的。 就是__try, __except結構, 上述代碼如果改成如下代碼異常即可捕獲。 __try { BYTE* pch ; pch = ( BYTE* )00001234 ; //給予一個非法地址 *pch = 6 ; //對非法地址賦值,會造成Access Violation 異常 } __except( EXCEPTION_EXECUTE_HANDLER ) { AfxMessageBox( "catched" ) ; } 但是用__try, __except塊還有問題, 就是這個不是C++標準, 而是Windows平台特有的擴充。 而且如果在使用過程中涉及局部對象解構函式的調用,則會出現C2712 的編譯錯誤。 那麼還有沒有別的辦法呢?當然有, 就是仍然使用C++標準的try{}catch(..){}, 但在編譯命令列中加入 /EHa 的參數。這樣VC編譯器不會把try catch模組給最佳化掉了。 本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/startexcel/archive/2009/05/19/4201585.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.