一 如何合適處理程式的異常

2021-06-19 04:21:49 字數 1971 閱讀 1444

關於函式可能丟擲的異常的一些宣告

void f() throw() 表示f不允許丟擲任何異常,即f是異常安全的。

void f() throw(...) 表示f可以丟擲任何形式的異常。

void f() throw(exceptiontype); 表示f只能丟擲exceptiontype型別的異常。

宣告乙個不丟擲異常的函式後,你有責任保證在你的函式的實現裡面不會丟擲異常。

附上別人的一些心得,有空可以驗證一下:

1) 函式後面宣告 throw() 只是介面的提供者和介面的使用者間的默契或稱協議。

2) 這種協議不影響正常的異常處理流程。

3) vc2005 會在編譯器對這種協議的遵守情況進行檢查,並在為遵守協議的情況下 給出警告。

用於列印呼叫堆疊的輔助函式,可以在異常發生的時候列印事故現場

:(需要編譯時加上-g -rdynamic兩個選項)

std::string getstacktrace()

free(stacktrace);

}建立自己的異常類,用於儲存額外的異常資訊:錯誤碼,堆疊,錯誤資訊等

class baseexception:public std::runtime_error

;baseexception::baseexception(int errorcode, const std::string& errormessage,,const std::string &btinfo) :

std::runtime_error(errormessage)

baseexception::~baseexception() throw()

int baseexception::geterrorcode(void) const

const char* baseexception::what() const throw()

const char* baseexception::getbtinfo() const throw()

1在程式的最外圍,應該用try/catch將程式入口包起來,防止因為有異常沒捕捉導致程式core

int main()

catch(baseexception &base_exception)

catch(baseexception &std_exception)

catch(...)

}2 正確處理new的問題,不應該直接使用系統的new,因為系統級的new有可能會丟擲bad_alloc &memexp這種型別的異常,比較合適的做法應該是用建立工廠,例如:

int * createint()

catch(bad_alloc &memexp)

}3 通過new建立的物件,應該用std::shared_ptr之類的只能包裝起來,比較安全

4 底層的資料介面,一定要搞明白會不會拋異常,如果會,就需要跟new一樣包裝一下,不然一旦出錯,沒有錯誤資訊和堆疊資訊,你都不知道發生什麼事,比如c++11中的std::stoi,std::stod

就是會拋異常,需要包裝一下

5 多執行緒程式,子執行緒的異常是不會被主線程的try/catch捕獲的,因此每個子執行緒需要自己捕捉自己執行緒內部可能發生的異常

6  現在來考慮這樣乙個建構函式:

type() : m_a(new typea), m_b(new typeb){}

假設成員變數m_a和m_b是原始的指標型別,並且和type內的申明順序一致。這樣的**是不安全的,它存在資源洩漏問題,建構函式的失敗回滾機制無法應對這樣的問題。如果new typeb丟擲異常,new typea返回的資源是得不到釋放機會的. 

解決方法:

shared_ptrm_a; shared_ptrm_b;這樣,我們就可以輕而易舉地寫出異常安全的**:

type() : m_a(new typea), m_b(new typeb){}

7 處理程序可能會收到的訊號:

程序可能會收到系統傳送的訊號,如果不處理某些訊號,程序的預設響應是終止,因此,為保證正確性,應該正確的處理訊號。

特徵處理之一 如何處理連續型特徵

對於傳統的機器學習 資料探勘問題,在cv nlp領域之外,一般而言特徵工程是很重要的。對特徵進行異常處理亦或是組合的時候往往需要考慮實際業務,但是在實際業務之外,也有那麼一些常規的技巧可以遵循。沒錯,來句廢話 連續型特徵的原始形態就可以作為模型的輸入,無論是linearregression 神經網路...

程式的異常處理

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

如何讓程式更穩健 異常處理

異常是指程式執行時引發的錯誤,引發錯誤的方式有很多,例如,除0 下標越界 檔案不存在 網路異常 型別錯誤等等。出現錯誤將會導致程式終止 如果能合理的使用異常處理結構,對程式可能出現的異常進行處理,將python晦澀難懂的錯誤提示轉化為對使用者更加友好 更加清晰明了的提示,就能使得程式更加健壯,具有更...