關於異常和其他

2021-09-29 14:17:12 字數 3179 閱讀 9054

關於異常的幾種處理方法:

1、 呼叫abort()

abort()函式的原型位於標頭檔案cstdlib.h(或者stdlib.h)中,其典型實現是向標準錯誤流(即cerr使用的錯流),傳送abnormal program termination(程式異常終止),然後終止程式。它還返回乙個隨實現而異的值。

abort()是否重新整理檔案緩衝區(用於儲存讀寫到檔案中的資料的記憶體區域)取決於實現

但是,也可以使用exit(),該函式重新整理檔案緩衝區,但不顯示資訊。

2、 返回錯誤碼

常規錯誤處理方法,將錯誤列印出來。

3、 異常機制

異常提供了將控制權從程式的乙個部分傳遞到另乙個部分的途徑

對異常處理有3個部分組成:

引發異常

使用處理程式捕獲異常

使用try塊

throw語句實際上是跳轉,即命令程式跳轉到另一條語句。throw關鍵字表示引發異常,緊隨其後的值指出了異常的特徵。

catch關鍵字表示捕獲異常,隨後是位於括號中的型別宣告,它指出了異常處理程式要響應的異常型別,然後是乙個花括號括起的**塊,指出要採取的措施。catch關鍵字和異常處理型別用作標籤,指出當異常被引發時,程式應跳到這個位置執行。

try塊標識其中特定的異常可能被啟用的**塊,它後面跟乙個或多個catch塊。try的後面是乙個由花括號括起的**塊,表明需要注意這些**引起的異常。

demo1:

#include

using namespace std;

double hmean(double a,double b);

int main()

catch (const char* s)

cout << 「harmonic mean of」 << x << 「and」 << y << 「is」 << z << endl;

cout << 「enter next set of numbers」 << endl;

}

cout << "bye!" << endl;

getchar();

return 1;

double hmean(double a,double b)

return 2.0ab / (a+b);}/*

執行throw語句類似於執行返回語句,因為它也將終止函式的執行;

但是throw不是將控制權返回給呼叫程式,而是導致程式沿函式呼叫序列後退,直到找到包含try塊的函式。

在這個例子中,throw將程式控制權返回給main(),程式將在main()中尋找與引發的異常型別匹配的異常處理程式(位於try塊的後面)

出現異常時的程式流程:

1、程式在try塊中呼叫hmean()

2、hmean()引發異常,將從而執行catch塊,並將異常字串賦給s

3、catch返回到while迴圈開始的位置

*/demo2:

將物件用作異常型別

//將物件用作異常型別

#include

using namespace std;

class bad_hmean

void mesg();

};inline void bad_hmean::mesg()

class bad_gmean

const char* mesg();

};inline const char* bad_gmean::mesg()

#include

#include

#include 「48.cpp」

//函式原型

double hmean(double a,double b);

double gmean(double a,double b);

int main()

catch (bad_hmean& bh)

catch (bad_gmean& bg)

}cout << 「bye!」 << endl;

system("pause");

return 1;

}

double hmean(double a,double b)

return 2.0ab / (a + b);

}double gmean(double a,double b)

return sqrt(a * b);

/*其他異常特性:

1、控制權返回

2、引發異常時編譯器總是建立乙個臨時拷貝,即使異常規範和catch塊中指定的是引用

demo:

class problem;

…void super() throw(problem)}…

trycatch(problem& p)

p將指向oops的副本而不是oops本身,這是件好事,因為函式super()執行完畢後,oops將不復存在。

順便說一句,將引發異常和建立物件組合在一起將更加簡單:

throw problem(); //就是將前面建立類物件的那兩句 合併在一起

問題:既然throw語句將生成副本,為何**中使用引用??

回答:1、基類引用可以執行派生類物件。假設有一組通過繼承關聯起來的異常型別,

則在異常規範中只需列出乙個基類引用,它將與任何派生類物件匹配。

重點:catch塊的排列順序應該與派生類順序相反

demo:

class bad_1;

class bad_2 : public bad_1;

class bad_3 : public bad_2;

…void duper()

…try

catch(bad_3& b3)

catch(bad_2& b2)

catch(bad_1& b1)

如果將bad_1&處理程式放在最前面,它將捕獲bad_1,bad_2,bad_3;通過按相反的順序排列,bad_3異常將被bad_3處理程式所捕獲

如果不知道呼叫的函式可能引發哪些異常,方法是使用省略號來表示異常型別,從而捕獲任何異常。

catch(…) //三個點,捕獲任何異常

*//*

exception類

#include

**可以引發exception異常,也可以將exception類用作基類。

有乙個名為what()的虛擬成員函式,它將返回乙個字串,該字串的特徵隨實現而異。

了解一下,不做延伸

*/

異常和其他

異常rtti 將類宣告放在另乙個類中,在另乙個類中宣告的類被稱為巢狀類。作用域 宣告位置 包含它的類是否可以使用它 從包含它的類派生而來的類是否可以使用它 在外部是否可以用 私有部分是否 否保護部分是是 否公有部分是是 是,通過類限定符來使用 對異常處理有3部分組成 throw終止函式的執行,並使得...

關於異常和異常捕獲。

異常即非正常狀態,主要包括書寫或語法上的錯誤導致直譯器無法正常執行。異常描述 importerror 匯入模組 物件失敗 indexerror 序列中沒有此索引 index keyerror 對映中沒有這個鍵 nameerror 未宣告 初始化物件 沒有屬性 syntaxerror python 語...

C 異常6 其他異常特性

雖然throw catch機制類似於函式引數和函式返回機制,但是還是有些不同之處。其中之一是函式fun 中的返回語句將控制權返回到呼叫fun 的函式a中,但throw語句將控制權向上返回到第乙個這樣的函式 包含能夠捕獲相應異常的try catch組合。另乙個不同之處是,引發異常時,編譯器總是建立乙個...