異常處理: 1)處理機制: Try { 若try子句中的任何函數拋出logic_error或者調用另一 代碼 個函數拋出這類異常,則catch語句會立即執行; } Catch(logic_error& e){ 關鍵字throw表明函數將立即退出,不會返回到調用 處理程序 程序,而是一直向外退出,直到找到處理異常的語句; } n 若有異常則通過throw操作創建一個異常對象並拋擲。 n 如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。程序從try塊後跟隨的最後一個catch子句後面的語句繼續執行下去。 n catch子句按其在try塊後出現的順序被檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。 n 如果匹配的處理器未找到,則運行函數terminate將被自動調用,其缺省功能是調用abort終止程序。 2)拋出和捕獲值: 異常捕獲機制: Try塊中不需要捕獲所有的異常,當異常發生時,異常處理機制會子自裡向外的查找匹配的處理程序,並只執行滿足條件的第一個處理程序。 寫catch語句時,應該先匹配派生類,然後基類; 拋出的值可以是任何類型,基本類型或者對象;但是捕獲時,有類型轉換問題,(int—>double,或者char*àstring)改變原意; 為了解決這個問題,是拋出和捕獲對象: 例子: #include<iostream> #include<stdexcept> usingnamespace std; classFutureValueError : public logic_error{ public: FutureValueError(stringe):logic_error(e){} }; doublefuture(){ throw FutureValueError("illegalfuture_value "); return 2.0; } voidread(){ try{ double d=future(); cout<<"intread()"<<endl; //這種情況,以後的語句永遠執行不到 } catch(bad_alloc& e) { cout<<"catch bad_allocerror"<<e.what()<<endl; } } voidprocess_record(){ try{ read(); } catch(logic_error& e) { cout<<"catchlogic_error "<<e.what()<<endl; } } intmain(){ process_record(); system("pause"); } 運行結果: 分析:因為開始拋出的FutureVauleError ,沒有catch語句;所以繼續在拋出到read()函數塊的catch語句中,read()語句中的catch語句沒有滿足條件的處理機制;所以繼續拋出到process_error中,找到相應的處理機制; 這樣在異常拋出函數以後的語句不能執行; 標准程序庫異常處理 ++標准庫中的異常層次的根類被稱為exception,定義在庫的頭文件<exception>中 exception類的接口如下: namespacestd{ class exception{ public: exception() throw() ; exception(const exception&) throw() ; exception&operator=(const exception&) throw() ; virtual ~exception()throw() ; virtual const char* what()const throw() ; }; }