使用C 異常來取代exit 函式

2021-04-16 08:57:24 字數 1530 閱讀 8441

使用c++異常來取代exit()函式

從c語言開始接觸c++的人,恐怕都知道exit()這個函式,似乎現在很多的程式設計師都有這樣一種習慣,在程式一遇到錯誤、或任務剛完成時,把呼叫exit()函式當成是一種最好的結束程式的方法。在以前遺留的許多老式c/c++**中,這種現象非常普遍,但當手頭的軟體專案逐步進展並越來越大時,就不得不面臨合併以前分散的各個模組這項工作,此時,如果還有人記得起軟體日誌記錄、錯誤寬容度、或至少適當的清理工作,就已經是萬幸了。本文中要說的方法,決不是一條設計準則,但是可減輕修正那些未良好設計及實現的老式**時所帶來的痛苦。

用return來取代exit,無疑是解決此問題最顯而易見的方法,如果軟體專案非常簡單,這也是最高效的解決方案;然而,專案中經常有成打的函式分布在多個原始檔中,且這些函式的呼叫也巢狀在很深的層次中,那麼,事情就變得棘手了。如果在這種情況中,所有的函式都返回void,還是有可能修改它們,讓其返回乙個退出碼(exit code)的,但所付出的代價也很大;如果函式已經能返回乙個有意義的值,只是在遇到錯誤時,呼叫了exit(),那麼這項工作會變得更消耗時間,也會更加容易出錯。這裡說點題外話,使用exit()也是有可取之處的,當老式**沒有設計返回任何東西時,如果想得到返回碼(return code),只有靠exit()了。

有關此問題,還是有乙個解決方法的,在這種情況下,我們假定所有的源**已經為c++格式,或無需全部編譯就可以移植為c++格式,把所有exit出現的地方全部換成throw(這可以自動完成,甚至無須理解老**是怎樣工作的);接著,在任何適當的地方,捕捉為整數的異常碼,這種方法還可依據嚴重性或恢復程度的不同,在不同層面上處理錯誤。

請看以下示例,原始**如下:

// main.cpp

void main()

//另乙個原始檔

void proces**ail(...)

while ( !shutdown )

}void readmail(...)

//另乙個原始檔

int readbytes(...)

return nbytesread;

}在原始**中缺少恢復或日誌記錄的功能,如果發生了乙個錯誤,程式就會「消失」不見了,讓使用者手足無措。下面是重新組織後的**,注意,沒有修改函式修飾符:

void main() catch (int ret) }}

void proces**ail(...)

while ( !shutdown ) catch (int ret) else

break;

case ...}}

//繼續處理

...}

//throw()可以用來取代缺少的返回碼

//但也要注意由此帶來的效能損失

throw(s_ok);

} // proces**ail()

void readmail(...)

int readbytes(...)

return nbytesread;

}現在,修改以前遺留的老式專案時,是不是多點信心了呢?

python 使用異常來中斷 暫停執行緒

python 使用異常來中斷 暫停執行緒 h thread 執行緒控制代碼 stoptype 執行緒停止型別,返回1則正常中斷了執行緒 def doing ncout 0 while 1 ncout 1 print ncout time.sleep 0.1 def kill thread h thr...

C 退出函式exit

exit為c 的退出函式,宣告於stdlib.h中,對於c 其標準的標頭檔案為cstdlib,宣告為 void exit int value exit的功能為,退出當前執行的程式,並將引數value返回給主調程序。在main中return v 的效果 與exit v 相同。overflow為math...

C語言中的exit 函式

函式名 exit 所在標頭檔案 stdlib.h 功 能 關閉所有檔案,終止正在執行的程序。exit 1 表示異常退出.這個1是返回給作業系統的。exit x x不為0 都表示異常退出 exit 0 表示正常退出 exit 的引數會被傳遞給一些作業系統,包括unix,linux,和ms dos,以供...