Lab 15-1: Exception - from inside a constructor

 
實習目標 練習使用 C++ 例外狀況 (exception) 的處理機制 -
      當函式不能有回傳值時 (例如 建構元/解構元)
 
步驟一 我們在 LoggedStudentList 實習的步驟三中曾經有下列的設計:
    ofstream logfile("main2.log");
    LoggedStudentList sList(logfile);
如果上面的敘述成功開啟輸出檔案串流的話 (我們可以藉由 logfile.is_open() 來測試), 才產生 LoggedStudentList 物件, 這是兩階段的產生 sList 物件的方法, 例如:
    ofstream logfile("main2.log");
    if (logfile.is_open())
    {
        LoggedStudentList sList(logfile);
        ...
    }

另外一種設計是直接把輸出檔案名稱傳入 LoggedStudentList 建構元中, 例如:

    LoggedStudentList sList("main2.log");
但是在這種狀況下如果檔案串流開啟失敗的話, 因為建構元沒有傳回值, 沒有辦法顯示開啟失敗的狀況, 所以必須使用 try-throw-catch 來處理了, 例如:
    try
    {
        LoggedStudentList sList("main2.log");
        ...
    }
    catch (exception &e)
    {
        ...
    }

如果在 LoggedStudentList 建構元中發現無法順利建構該物件的話, 就使用 throw 的語法產生一個 std::exception 的衍生物件, 由 catch 的敘述來處理這種例外狀況 , 或是

    try
    {
        LoggedStudentList sList("main2.log");
        ...
    }
    catch (char *e)
    {
        ...
    }

用 throw 的語法產生一個 字串型態 的例外狀況

步驟二 請拷貝在 LoggedStudentList 實習中完成的程式碼, 修改建構元函式, 參數改為檔案名稱的字元陣列:
    LoggedStudentList(const char *filename);
請修改類別成員 m_ofs 成為一個專屬的檔案串流成員物件,
    class LoggedStudentList : public StudentList
    {
    public:
        ...
    private:
        ofstream m_ofs;
    };

請注意此處我們用物件成員來設計而不是用指標或是參考成員來設計, 因為這個檔案串流是專屬於這個 LoggedStudentList 物件的, 物件解構時檔案串流就直接關閉掉

運用初始化串列建構 m_ofs 檔案串流成員物件,

    LoggedStudentList::LoggedStudentList(const char *filename)
        : m_ofs(filename)
    {
    }
如果建構失敗的話, 運用 throw 敘述丟出一個字串型態的例外, 例如:
    if (!m_os.is_open())
        throw "File stream not opened!";

請注意: 如果要 throw 一段任意的字串的話, 你需要動態配置字元陣列, 同時在 catch 敘述處理完畢時需要 delete[] 掉那個字元陣列

請注意: catch 敘述所捕捉的例外狀況一定要和 throw 敘述裡面丟出的例外狀況相同, 才能夠順利執行 (如果你直接拷貝步驟一和步驟二的程式碼應該會遇見不一致的問題。

步驟三 請撰寫 try - catch 的程式來完成 LoggedStudentList 實習 步驟三的測試

範例執行程式

正常執行結果

0:[Mary Chen, 111111111, 0933111111, Business]
1:[John Wang, 222222222, 0928222222, Computer Science]
2:[Mel Lee, 333333333, 0968333333, Mechanical Engineering]
3:[Bob Tsai, 444444444, 0930444444, Electrical Engineering]
4:[Ron Yang, 555555555, 0918555555, Computer Science]
[John Wang, 222222222, 0928222222, Computer Science]
Bob Tsai's entry deleted successfully!
Can not find Bob Tsai's entry!

The following two students are of the same department:
[John Wang, 222222222, 0928222222, Computer Science]
[Ron Yang, 555555555, 0918555555, Computer Science]

[Mary Chen, 111111111, 0933111111, Business]
[John Wang, 222222222, 0928222222, Computer Science]
[Mel Lee, 333333333, 0968333333, Mechanical Engineering]
[Carol Chen, 333331111, 0933333111, Business]
[Ron Yang, 555555555, 0918555555, Computer Science]
如果在檔案總管中將 main2.log 設為唯讀檔案, 檔案開啟失敗, 輸出結果為:
main()::Cannot open file main2.log !!
        program aborted
步驟四 請助教檢查後, 將所完成的專案 (只需保留 .cpp, .h, .sln 以及 .vcxproj 檔案即可; 刪除掉 .suo, .sdf, .filters, .users, debug\ 資料匣, 以及 ipch\ 資料匣下的所有內容) 壓縮起來, 選擇 Lab15-1 上傳, 後面的實習課程可能需要使用這裡所完成的程式

C++ 物件導向程式設計課程 首頁

製作日期: 05/31/2004 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon