第六章:語句

switch:只能在最後一個 case 標號(無default) defaul 標號後定義變量:此規則是爲了避免出現跳過變量的定義和初始化的情況。 如果需要爲某個特殊的 case 語句定義變量,可引入塊語句。

異常機制:try 塊和異常處理

throw 表達式, try 塊catch 子句(也稱爲處理代碼),標準庫定義的異常類

	Sales_item item1,item2;
	while(cin>>item1>>item2)
	{
	try
	{
		if(!item1.same_isbn(item2))
			throw runtime_error("1.Data must refer to the same ISBN:");// 字符串初始化 runtime_error
		cout<<item1+item2<<endl;
	}
	catch (runtime_error a) // 對象 a
	{
		cout<<a.what()  //返回 C 風格字符串(unsigned char* 類型值)
			<<"\nTry Again? Enter y or n"<<endl;
		char c;
		cin>>c;
		if(cin && c=='n')
			break;
	}
	

如果不存在處理該異常的 catch 子句,程序運行跳轉到 terminate 的標準庫函數,該函數在 exception 頭文件中定義。然後通過調用 abort 來終止程序運行。

通常系統出現異常,系統自動調用 terminate 來終止程序執行。

利用預處理器進行調試

1.使用 NDEBUG 預處理變量(其實任意變量都可以)實現有條件的調試代碼:

int main()
{
#ifndef NDEBUG
cerr<<"starting main"<<endl;
#endif
//...
}

開發完成後,定義 NDEBUG 預處理變量,(有效地)刪除這些調試語句。

2.預處理器定義四種在調試時非常有用的常量:

_ _FILE_ _

_ _LINE_ _

_ _DATE_ _

_ _TIME_ _

     string word;
     cin>>word;
     if(word.size()<5);
             cerr<<"Error: "<<__FILE__
                 <<"  line: "<<__LINE__
                 <<"\nCompiled on "<<__DATE__
                 <<" at "<<__TIME__<<endl
                 <<"      Word read was \""<<word
                 <<"\" Length too short "<<endl;

3.使用NDEBUG 預處理變量 及 assert 預處理宏。優秀參考:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html

	string word;
	cin>>word;
	assert(word.size()<10);
			cerr<<"Error: "<<__FILE__
				<<"  line: "<<__LINE__
				<<"\nCompiled on "<<__DATE__
				<<" at "<<__TIME__<<endl
				<<"      Word read was \""<<word
				<<"\" Length too short "<<endl;
// 確保所有的單詞長度都小於10 

 

最後在 #include<cassert> 之前加上 #define NDEBUG 來定義 NDEBUG,則 assert 語句不做任何工作,沒有任何運行時代價,也不會引起任何運行時檢查。當然,僅用於檢查確實不可能發生的事情。

標準異常:

標準庫異常類定義在以下四個頭文件中

exception、bad_alloc、bad_cast 類型只有默認構造函數。其他只有一個使用 string初始化的構造函數。

1exception頭文件:定義了最常見的標準異常類,其類名爲exception

   只通知異常的產生,但不會提供更多的信息

2stdexcept頭文件定義了以下幾種常見異常類

   類型                   說明

exception            最常見的問題

runtime_error      運行時錯誤:僅在運行時才能檢測到的問題

range_error         運行時錯誤:生成的結果超出了有意義的值域範圍

overflow_error     運行時錯誤:計算上溢

underflow_error   運行時錯誤:計算下溢

logic_error           邏輯錯誤:可在運行前檢測到的問題

domain_error        邏輯錯誤:參數的結果值不存在

invalid_argument   邏輯錯誤:不合適的參數

length_error         邏輯錯誤:試圖生成一個超出該類型最大長度的對象

out_of_range       邏輯錯誤:使用一個超出有效範圍的值

3new頭文件定義了bad_alloc異常類型,提供因無法分配內存而由new拋出的異常

4type_info頭文件定義了bad_cast異常類型(要使用type_info必須包含typeinfo頭文件)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章