用C++異常取代exit()函數

來源:互聯網
上載者:User

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

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

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

請看以下樣本,原始代碼如下:

// main.cpp
void main() {
 //初始化
 ...
 ProcessMail(...);
}
//另一個源檔案
void ProcessMail(...) {
 //初始化
 ...
 if ( initializationError ) {
  printf("faild to init!!!\n");
  exit(-1);
 }
 while ( !shutdown ) {
  ReadMail(...)
  //繼續處理
  ...
 }
}
void ReadMail(...)
{
 ...
 //對ReadBytes()的調用出現在函數內的多處地方,包括在迴圈中。
 nBytesAvailable = ReadBytes(...)
 ...
}
//另一個源檔案
int ReadBytes(...)
{
 //讀取資料
 ...
 if ( error ) {
  printf("there was an error!!\n");
  exit(-1);
 }
 return nBytesRead;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.