C/C++程序運行時的異常處理

2021-01-07 中國軟體網

   (中國軟體網訊)程序中的錯誤分為編譯時的錯誤和運行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而運行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如內存空間不夠,或者在調用函數時,出現數組越界等錯誤。如果對於這些錯誤沒有採取有效的防範措施,那麼往往會得不到正確的運行結果,程序不正常終止或嚴重的會出現死機現象。我們把程序運行時的錯誤統稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機制結構清晰,在一定程度上可以保證程序的健壯性。

C++中處理異常的過程是這樣的:在執行程序發生異常,可以不在本函數中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,運行系統會自動調用系統函數terminate,由它調用abort終止程序。這樣的異常處理方法使得異常引發和處理機制分離,而不在同一個函數中處理。這使得底層函數只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函數去處理。

C++的異常處理機制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模塊中,檢查語句發生錯誤,throw拋出異常,發出錯誤信息,由catch來捕獲異常信息,並加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。異常處理的一般格式為:

下面我們用示例演示一下異常處理:

結果:

看了上述的示例代碼,也許有人會問,第二個雙精度類型的除法計算也應該拋出異常才對啊,在實際的運行過程中並非如此,其實該雙精度類型除法函數根本沒有被執行過。以上程序的執行規程為:調用函數Div(x,y)時發生異常,由函數Div中的語句"throw y"拋出異常,並不在往下執行return x/y,接著catch捕獲int類型的異常並處理異常,最後直接執行"return 0"。因此函數Div(x1,y1)和catch(double){}模塊根本沒有被執行。如果,我們把y的值改為1,則結果就變成為:

如果在執行try語句模塊時,沒有發生異常,則catch語句塊不起作用,流程轉到其後的語句繼續執行。從上述兩個結果中可知第一次throw拋出的int類型所以找到處理該類型的catch,而第二次是拋出double類型所找到的是處理double類型的catch。

下面對異常處理補充幾點:(1)try和catch塊中必須要用花括號括起來,即使花括號內只有一個語句也不能省略花括號;(2)try和catch必須成對出現,一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常信息匹配;(3)如果在catch塊中沒有指定異常信息的類型,而用刪節號"...",則表示它可以捕獲任何類型的異常信息;(4)如果throw不包括任何表達式,表示它把當前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;(5)C++中一旦拋出一個異常,如果程序沒有任何的捕獲,那麼系統將會自動調用一個系統函數terminate,由它調用abort終止程序

最後還是一樣,我將用一個示例來總結一下今天所講的內容(開發工具:vs2010):

結果:




免責聲明:

本站系本網編輯轉載,會儘可能註明出處,但不排除無法註明來源的情況,轉載目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責。如涉及作品內容、版權和其它問題,請在30日內與本網聯繫, 來信: liujun@soft6.com 我們將在收到郵件後第一時間刪除內容!

[聲明]本站文章版權歸原作者所有,內容為作者個人觀點,不代表本網站的觀點和對其真實性負責,本站擁有對此聲明的最終解釋權。

相關焦點

  • 解析一下C++的異常處理
    本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】經微信公眾號授權轉載,如需轉載與原文作者聯繫總述在程序運行過程中經常會碰到一些問題,例如數組下標越界,除數為零等,這些錯誤不過能被發現處理,則我們的代碼很有可能會導致程序崩潰。
  • C語言代碼中異常的處理機制
    C++的異常機制為我們提供了更好的解決方法。異常處理的基本思想是:當出現錯誤時拋出一個異常,希望它的調用者能捕獲並處理這個異常。如果調用者也不能處理這個異常,那麼異常會傳遞給上級調用,直到被捕獲處理為止。如果程序始終沒有處理這個異常,最終它會被傳到C++運行環境,運行環境捕獲後通常只是簡單地終止這個程序。
  • C/C++優勢究竟在哪裡?是什麼讓他們經久不衰?看看這個你就懂了
    相較於C語言,c++誕生於1983年,緊隨c語言的步伐,c++是C語言的超集,大家所知道的C語言是面向過程的,java是面向對象的,那麼C語言為了面向對象,所以誕生出現在大家所熟知的c++,被廣泛視為大規模應用構建軟體。
  • python+C、C++混合編程的應用
    python與C/C++混合編程的本質是python調用C/C++編譯的動態連結庫,關鍵就是把python中的數據類型轉換成c/c++中的數據類型,給編譯函數處理,然後返回參數再轉換成python中的數據類型。
  • C 語言會比 C++ 快?
    在編譯代碼時你會注意到 400 毫秒,即使它只有一個文件。而當我處理代碼的時候,這樣的事情會讓我不那麼開心,因為有很多這樣的文件,累積的編譯性能可能會很差。這樣的情況是因為我們的實現對於 STL 依賴非常簡單,我們只使用其中三個算法/容器。讓我們看看當我們停止使用其中一個時會發生什麼。
  • 【編碼】C++異常處理 - try,catch,throw,finally的用法
    當出現一個硬體或軟體異常時,作業系統向應用程式提供機會來考察是什麼類型的異常被引發,並能夠讓應用程式自己來處理異常。下面就是異常處理程序的語法:__try{//保護塊}__except(異常過慮器){//異常處理程序}注意__ e x c e p t關鍵字。
  • C++程序7 :IO流與異常處理
    ].name <<setw(4) << readInfo[i].age <<setw(5) << readInfo[i].num << endl;}fMM.close();system("pause");return 0;}四、異常處理
  • 選擇題 | C++輸入輸出和異常處理
    A.myfile.seekg(1,ios::end);                            c=myfile.get();                  B.myfile.seekg(-1,ios::end);      c=myfile.get();C.myfile.seekp(ios::end,0);
  • C/C++可變參數函數
    c/c++支持可變參數的函數,即函數的參數是不確定的。一、為什麼要使用可變參數的函數?一般我們編程的時候,函數中形式參數的數目通常是確定的,在調用時要依次給出與形式參數對應的所有實際參數。但在某些情況下希望函數的參數個數可以根據需要確定,因此c語言引入可變參數函數。這也是c功能強大的一個方面,其它某些語言,比如fortran就沒有這個功能。典型的可變參數函數的例子有大家熟悉的printf()、scanf()等。二、c/c++如何實現可變參數的函數?
  • 異常處理的其他3個小技巧
    這是菜鳥學python的第35篇原創文章閱讀本文大概需要3分鐘        異常處理前面已經講了有3篇了,前面3篇文章基本把異常的主要內容都講了,想來想去還有一小塊遺漏了,今天我們就把這3點補上吧要點:1)主動拋出異常2)利用斷言發現問題3)如何處理多個異常
  • C/C++程序core dump分析(一)
    1)編譯環境與運行環境如果近期存在對依賴庫和編譯參數的變更,則它們的嫌疑非常大,建議首先嘗試回滾相關修改,驗證問題是否恢復。對於新的程序或新的機器,編譯環境和運行環境的差異往往也是此類問題的罪魁禍首,應當仔細排查其差異,或使用一致的環境進行驗證。
  • 簡要記錄丨VSCode 搭建基礎 C/C++ 編譯環境
    8        "args": [], // 程序調試時傳遞給程序的命令行參數,一般設為空即可 9        "stopAtEntry": false, // 設為true時程序將暫停在程序入口處,相當於在main上打斷點10        "cwd": "${workspaceFolder}", // 調試程序時的工作目錄,此為工作區文件夾;改成${fileDirname
  • C++:15---異常機制
    1.概念:異常處理是一種允許兩個獨立開發的程序組件在程序執行時遇到不正常的情況相互通信的工具
  • java NullPointerException異常處理
    java語言與其他程式語言不同,它有嚴格的異常處理機制,如果需要拋出異常的代碼塊中沒有捕獲異常,程序將不會成功編譯,換言之:未使用異常捕獲、異常捕獲方式不正確等,都將導致代碼不能被jvm編譯。從上面的java異常結構可以看出NullPointerExcetion繼續自RuntimeException,即表示這是一種運行時才會觸發的異常。當程序運行時,對象未初始化或為空時,NullPointerException就出現了,寫Java程序時要特別注意這個異常,該異常不捕獲,直接導致整個程序崩潰。
  • Linux平臺中調試C/C++內存洩漏方法 (騰訊和MTK面試的時候問到的)
    程序通過 valgrind 運行時,valgrind 收集各種有用的信息,通過這些信息可以找到程序中潛在的 bug 和性能瓶頸。Valgrind 現在提供多個工具,其中最重要的是 Memcheck,Cachegrind,Massif 和 Callgrind。Valgrind 是在 Linux 系統下開發應用程式時用於調試內存問題的工具。
  • 每日乾貨丨C++異常處理入門(try和catch)
    3) 運行時錯誤是指程序在運行期間發生的錯誤,例如除數為 0、內存分配失敗、數組越界、文件不存在等。C++ 異常(Exception)機制就是為解決運行時錯誤而引入的。運行時錯誤如果放任不管,系統就會執行默認的操作,終止程序運行,也就是我們常說的程序崩潰(Crash)。
  • C語言編程工具選擇
    一、編程工具計算機處理的數據、接受的指令是二進位數據,用C語言編寫的程序需要轉變成計算機能識別的二進位,才能讓計算機工作,這個轉換過程就是使用編譯器對源程序進行編譯,雖然可以使用命令行的方式編譯源程序,但使用編程工具不僅可以編譯源程序,還可以編寫、調試等,可以簡化編程工作。
  • Python異常處理,告別xxxxError
    首先需要明白的是,我們無法完全阻止錯誤發生,但是可以提前預防以至於程序不會崩潰。這個提前預防的動作稱為異常處理(exception handling)。總之異常處理就是為了防患於未然。語句處理異常時,可以在後面「顯性」寫出我們要處理的錯誤類型,即 ZeroDivisionError。
  • C/C++常見面試題整理
    1、C++裡面如何聲明const void f(void)函數為C程序中的庫函數?2、c++中類和c語言中struct的區別(至少兩點)3、變量的聲明和定義有什麼區別?4、memset ,memcpy 的區別5、程序什麼時候應該使用線程,什麼時候單線程效率高。6、介紹一下模板和容器。如何實現?
  • 實現32位簡單版Windows和Linux雙平臺的C++運行庫
    一般這些C++的運行庫都是依賴於C運行庫的,它們僅包含對C++的一些特性的支持,比如new/delete、STL、異常處理、流( stream)等。但是它們並不包含諸如入口函數、堆管理、基本文件操作等這些特性,而這些也是C++運行庫所必需的,比如C++的流和文件操作依賴於C運行庫的基本文件操作,所以它必須依賴於C運行庫。