C++ 中的throw和throw new

 

今天看組裏面的老測試代碼,很多地方用的是throw new std::exception(),沒多想就抄了過來,然後在client端用catch(const std::exception& e)的方式捕獲異常。可是在測試案例中觸發拋出異常之後,client的catch總是無法捕獲,最終程序以未捕獲異常退出,十分奇怪。去stackoverflow上搜了下相關話題,原來throw new exception的時候是拋出一個異常的指針,client端需要捕獲指針(catch exception* e),而且要負責清理指針指向的資源。而相對的,如果拋出時使用throw exception(不用new),那麼捕獲的時候用const reference即可。同樣,問題解決了,不過想想這兩種方式有什麼區別和利弊呢?

stackoverflow上的意見是一邊倒的,throw new exceptionClass的方法不是一個好主意,因爲client需要處理指針指向的資源,在沒有足夠上下文的情況下這不是很容易的事情。而且處理指針的資源的申請釋放工作本身就會有異常風險,遇到了重異常就更糟糕了。相對的,throw execeptionClass的時候,編譯器會自動的建立一個異常class的對象,並傳導捕獲方法的引用中去,而且編譯器會負責清理對象所佔內存,所以一舉兩得,throw exception是理想的方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章