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初始化的構造函數。
1、exception頭文件:定義了最常見的標準異常類,其類名爲exception。
只通知異常的產生,但不會提供更多的信息
2、stdexcept頭文件定義了以下幾種常見異常類
類型 說明
exception 最常見的問題
runtime_error 運行時錯誤:僅在運行時才能檢測到的問題
range_error 運行時錯誤:生成的結果超出了有意義的值域範圍
overflow_error 運行時錯誤:計算上溢
underflow_error 運行時錯誤:計算下溢
logic_error 邏輯錯誤:可在運行前檢測到的問題
domain_error 邏輯錯誤:參數的結果值不存在
invalid_argument 邏輯錯誤:不合適的參數
length_error 邏輯錯誤:試圖生成一個超出該類型最大長度的對象
out_of_range 邏輯錯誤:使用一個超出有效範圍的值
3、new頭文件定義了bad_alloc異常類型,提供因無法分配內存而由new拋出的異常
4、type_info頭文件定義了bad_cast異常類型(要使用type_info必須包含typeinfo頭文件)