Linux 下 C 程式的異常處理技巧

2021-04-20 01:03:46 字數 1811 閱讀 3281

在 c++中,無論何時在處理程式內捕獲乙個異常,關於該異常**的資訊都是不為人知的。異常的具體**可以提供許多更好地處理該異常的重要資訊,或者提供一些可以附加到錯誤日誌的資訊,以便以後進行分析。 

為了解決這一問題,可以在丟擲異常語句期間,在異常物件的建構函式中生成乙個堆疊跟蹤。exceptiontracer 是示範這種行為的乙個類。 

清單 1. 在異常物件建構函式中生成乙個堆疊跟蹤

在全域性(靜態全域性)變數的構造和析構期間,每個 ansi c++ 都捕獲到異常是不可能的。因此,ansi c++ 不建議在那些其實例可能被定義為全域性例項(靜態全域性例項)的類的建構函式和析構函式中丟擲異常。換一種說法就是永遠都不要為那些其建構函式和析構函式可能丟擲異常的類定義全域性(靜態全域性)例項。不過,如果假定有乙個特定編譯器和乙個特定系統,那麼可能可以這樣做,幸運的是,對於 linux 上的 gcc,恰好是這種情況。 

使用 exceptionhandler 類可以展示這一點,該類也採用了 singleton 設計模式。其建構函式註冊了乙個未捕獲的處理程式。因為每次只能有乙個未捕獲的處理程式處理乙個活動程序,建構函式應該只被呼叫一次,因此要採用 singleton 模式。應該在定義有問題的實際全域性(靜態全域性)變數之前定義 exceptionhandler 的全域性(靜態全域性)例項。 

清單 3. 處理建構函式中的異常

class exceptionhandler

static

void handler()

catch (segmentationfault &)

catch (floatingpointexception &)

catch (...)

//if this is a thread performing some core activity

abort();

// else if this is a thread used to service requests

// pthread_exit();}};

public:

exceptionhandler()

};//

class a

};// before defining any global variable, we define a dummy instance

// of exceptionhandler object to make sure that

// exceptionhandler::singletonhandler::singletonhandler() is invoked

exceptionhandler g_objexceptionhandler;

a g_a;

//int main(int argc, char* argv)

有時一些異常沒有**獲,這將造成程序異常中止。不過很多時候,程序包含多個執行緒,其中少數執行緒執行核心應用程式邏輯,同時,其餘執行緒為外部請求提供服務。如果服務執行緒因程式設計錯誤而沒有處理某個異常,則會造成整個應用程式崩潰。這一點可能是不受人們歡迎的,因為它會通過向應用程式傳送不合法的請求而助長拒絕服務攻擊。為了避免這一點,未捕獲處理程式可以決定是請求異常中止呼叫,還是請求執行緒退出呼叫。清單 3 中 exceptionhandler::singletonhandler::handler() 函式的末尾處展示了該處理程式。 

結束語

我簡單地討論了少許 c++ 程式設計設計模式,以便更好地執行以下任務: 

·在丟擲異常的時候追蹤異常的**。

·將訊號從核心程式轉換成 c++ 異常。

·捕獲構造和/或析構全域性變數期間丟擲的異常。

·多執行緒程序中的異常處理。

我希望您能採用這些技巧中的一些來開發無憂**。

Linux 下 C 異常處理技巧

處理固有語言侷限性的四種技術 sachin o.agrawal sachin agrawal in.ibm.com 高階軟體工程師,ibm software labs,india 簡介 處理 c 中的異常會在語言級別上遇到少許隱含限制,但在某些情況下,您可以繞過它們。學習各種利用異常的方法,您就可以...

程式的異常處理

二 什麼時候處理異常 僅當以下一種或多種情況時,我們的 才需要抓住異常 1.記錄異常 logging 將異常記錄到日誌中,便於support人員查詢錯誤原因。2.為這個異常新增相關資訊 wrap exception 加發生異常的環境資訊記錄,並產生新異常,交給呼叫本方法的 負責處理。3.執行清理工作...

C 在windows下的異常處理

專案大了 多了以後難免會出些問題導致程式崩潰,為了快速定位崩潰的位址與原因,引入了setunhandledexceptionfilter這個api。久了後發現這個api有些情況下無法work,異常會被其他異常處理接管。這樣就無法定位到自己的崩潰原因。後面查了下,大致是在新的msvcr.dll中會接管...