轉載自:https://blog.csdn.net/qq_40191710/article/details/81063878
前言
1)異常是一種程序控制機制,與函數機制獨立和互補
函數是一種以棧結構展開的上下函數銜接的程序控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設置多個異常類型作為網捕條件,從而以類型匹配在棧機制中跳躍回饋.
2)異常設計目的:
棧機制是一種高度節律性控制機制,面向對象編程卻要求對象之間有方向、有目的的控制傳動,從一開始,異常就是沖着改變程序控制結構,以適應面向對象程序更有效地工作這個主題,而不是僅為了進行錯誤處理。
異常設計出來之后,卻發現在錯誤處理方面獲得了最大的好處。
一、異常處理的基本思想:
在 h()函數中專注於業務的處理,而不用去處理異常
讓 f()函數實現綜合的處理
1)C++的異常處理機制使得異常的引發和異常的處理不必在同一個函數中,這樣底層的函數可以着重解決具體問題,而不必過多的考慮異常的處理。上層調用者可以再適當的位置設計對不同類型異常的處理。
2)異常是專門針對抽象編程中的一系列錯誤處理的,C++中不能借助函數機制,因為棧結構的本質是先進后出,依次訪問,無法進行跳躍,但錯誤處理的特征卻是遇到錯誤信息就想要轉到若干級之上進行重新嘗試,如圖:
3)異常超脫於函數機制,決定了其對函數的跨越式回跳。
4)異常跨越函數
二、C++異常處理的實現:
1、異常基本語法:
1)若有異常則通過throw操作創建一個異常對象並拋擲。
2)將可能拋出異常的程序段嵌在try塊之中。控制通過正常的順序執行到達try語句,然后執行try塊內的保護段。
3)如果在保護段執行期間沒有引起異常,那么跟在try塊后的catch子句就不執行。程序從try塊后跟隨的最后一個catch子句后面的語句繼續執行下去。
4) catch子句按其在try塊后出現的順序被檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。
5)如果匹配的處理器未找到,則運行函數terminate將被自動調用,其缺省功能是調用abort終止程序。
6)處理不了的異常,可以在catch的最后一個分支,使用throw語法,向上扔。
例如:
try { geometry_msgs::PointStamped point_base; point_base = buffer.transform(point_base,"base_link"); ROS_INFO("轉換后的數據:(%.2f,%.2f,%.2f),參考的坐標系是:",point_base.point.x,point_base.point.y,point_base.point.z); } catch(const std::exception & e) { ROS_INFO("程序異常"); }