關於異常的幾種處理方法:
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組合。另乙個不同之處是,引發異常時,編譯器總是建立乙個...