1. 程式人生 > >C語言異常處理

C語言異常處理

程式消亡的三種形式:無疾而終(程式正常執行結束)、他殺(系統對異常進行處理使程式終止)、自殺(在程式裡自己設定的對異常處理使程式執行終止)。
在C語言裡有幾種對異常進行處理的方式:
1、終止程式(除數為0):

int  Div(int Left, int Right)
{
    if (Right == 0)
    {
        exit(1);
    }
    return Left / Right;
}

2、返回一個表示錯誤的值附加錯誤碼

int  Div(int Left, int Right)
{
    if (Right == 0)
    {
        cout << GetLastError() << endl;
        return errno;
    }
    return Left
/ Right; }

3.返回一個合法值,讓程式處於某種非法的狀態(坑爹的atoi())

4.呼叫一個預先準備好在出現”錯誤”的情況下用的函式(回撥函式)

一個函式的函式指標作為另一個函式的引數

5.暴力解決方式:abort()或者exit() (同1)

6.使用goto語句 (goto語句只能在當前函式內進行跳轉,不能跳轉到該函式體之外 )

7、setjmp()和longjmp()組合
這裡寫圖片描述
如果將longjmp的呼叫放在setjmp之前則會出現如下錯誤
這裡寫圖片描述

1>、setjump必須先呼叫,在異常位置通過呼叫longjmp以恢復先前被儲存的程式執行點,否則將導致 不可預測的結果,甚至程式崩潰。
這裡寫圖片描述


而這裡的eax裡儲存的是1,也就是longjmp裡的1

2>、在呼叫setjmp的函式返回之前調動longjmp,否則結果不可預料。

setjmp()和longjmp()存在以下缺陷:
1、函式的使用者必須非常靠近函式呼叫的地方編寫錯誤處理程式碼,無疑使程式碼變的臃腫笨拙.
2、setjmp()和longjmp()並不能夠很好的支援C++面向物件的語義。

相關推薦

C語言異常處理之 setjmp()和longjmp()

divide font 變量 bsp ron 否則 sharp highlight == 異常處理之除0情況 相信大家處理除0時,都會通過函數,然後判斷除數是否為0,代碼如下所示: double divide(doublea,double b) { co

C 語言異常處理(五十二)

異常處理 C 中的異常處理 if...else... setjmp() longjmp() 我們今天來看下異常處理,在看 C++ 的異常處理之前,先來看看 C 語言中的異常處理。那麽什麽是異常呢?在程序運行過程中可能會產生異常,異常(Exception)與 Bug 的區別是

C++筆記 第六十三課 C語言異常處理---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第六十三課 C語言異常處理 1.異常處理 異常的概念 程式在執行過程中可能產生異常 異常(Exception)與Bug的區別 異常是程式執行時可預料的執行分支 Bug是程式中

第63課-C語言異常處理

一、異常處理 1. 異常的概念 程式在執行過程中可能產生異常 異常(Exception)與Bug的區別 異常時程式執行時可預料的執行分支 Bug是程式中的錯誤,是不被預期的執行方式 2. 異常(Exception)和B

C語言異常處理

程式消亡的三種形式:無疾而終(程式正常執行結束)、他殺(系統對異常進行處理使程式終止)、自殺(在程式裡自己設定的對異常處理使程式執行終止)。 在C語言裡有幾種對異常進行處理的方式: 1、終止程式(除數為0): int Div(int Left,

C語言下的setjmp longjmp(C 語言異常處理)

在C 語言中,我們不能使用 goto 語句來跳轉到另一個函式中的某個 label 處;但提供了兩個函式——setjmp 和 longjmp來完成這種型別的分支跳轉。後面我們會看到這兩個函式在處理異常上面的非常有用。 setjmp 和 longjmp 使

46.一個例子瞭解C++中異常處理

異常處理的棧展開、解構函式和建構函式的異常,異常處理的層次 catch的搜尋匹配 。。。 class wrong :public exception { public: wrong(const int& i = 0,const string& str = ""):err

C語言處理命令之檔案包含

檔案包含預處理命令的一般形式是: #include<檔名> 或者 #include“檔名” #include命令告訴前處理器用指定檔案的內容替換這條命令,兩種不同的命令格式決定了前處理器對指定檔案的搜尋方式:如果檔名是用一對尖括號括起來的,則前處理器直接到存放編譯器所提供的標準標頭檔案的目

.NET&C#的異常處理

args inf win 分享圖片 線程 patch tro handler environ 應用程序未捕獲異常的處理 處理未捕獲的異常是每個應用程序起碼有的功能 無論是Windows窗體程序還是WPF程序,我們都看到捕獲的異常當中分為"窗體線程異常"和"非窗體線程異常

(C/C++學習)14.C語言字串處理函式(二)

說明:上節著重解釋了字串處理的庫函式處理,這節將針對一些常用的需求,進行非庫函式的處理。 一.去除某一個字串中的某個字元 1.去除字串右邊的空格 1 void trimStrRightSpace(char * str) 2 { 3 while(*str) 4 s

c#】異常處理:try catch throw

        異常處理,是程式語言或計算機硬體裡的一種機制,用於處理軟體或資訊系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。 也就是說,在程式執行時出現的任何意外或異常情況時,處理這種意外或情況的方法,叫做異常處理。  

C語言 字串處理

//輸入一段字串,無論是否有重複字母出現, //都只打印出現過的小寫字母,並按照小寫字母順序列印。 //如輸入qewqwr322rqw<>211qESFSSEraZz, 列印aeqrwz) #include <stdio.h> void fun(); voi

14. C語言 -- 字串處理函式

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。

常用的c語言字串處理函式

1.獲取一個字串 char *p = fgets(buf, size, stdin);   2.字串查詢     ret = strstr(cmd, "test");     if(ret != NULL)    

C#複習——異常處理

除錯模式 debug Debug通常稱為除錯版本,通過一系列編譯選項的配合,編譯的結果通常包含除錯資訊,而且不做任何優化,以為開發人員提供強大的應用程式除錯能力。 release 被稱為釋出版本,是為使用者使用的,一般客戶不允許在釋出版本上進行除錯。所以不儲存除錯信 息,同

C語言字串處理基礎函式(一)

1.strlen()函式 功能:函式返回字串str 的長度( 即空值結束符之前字元數目,不包括控制結束符)。 語法: #include <string.h> size_t strlen( char *str ); 例子: #include <stdio

C++的異常處理

自定義異常 測試結果 signed 程序員 去掉 程序 自然 中斷 做出 異常處理在C++中的地位是很尷尬的,他不被很多公司或者程序員認可,但是基於某些原因,個人依然覺得異常處理在C++程序中 是非常必要的。 一般來說,異常分為兩大類,一個是拋出異常,另一個是接受異常然後處

C++】異常處理

一、什麼是異常處理         一句話:異常處理就是處理程式中的錯誤。 二、為什麼需要異常處理,以及異常處理的基本思想         C++之父Bjarne Stroustrup在《The C++ Programming Language》中講到:一個庫的作者可以

C語言—字串處理函式

1、puts(字串陣列) ,gets(字串陣列) 2、strcat(字串陣列1,字串陣列2) 把字串陣列2接到字串陣列1中。 3、strcpy(字串陣列1,字串陣列2) 把字串陣列2複製到字串陣列1中。 strncpy(字串陣列1,字串陣列2,n),將字串2中前n個

c# catch異常處理3種方式

如果需要向用戶提示 try { } catch(Exception ex) {    MessageBox.Show(ex.ToString()); } 如果需要向外層丟擲 try { } catch(Exception ex) {  &n