#《Essential C++》讀書筆記# 第七章 異常處理

基礎知識

異常處理機制有兩個主要成分:異常的鑑定和發出,以及異常的處理方式。一般,不管是membe function和non-member function,都有可能產生異常以及處理異常。異常出現後,正常程序的執行便被暫停(suspended)。與此同時,異常處理機制開始搜索程序中有能力處理這一異常的地點。異常被處理完畢以後,程序的執行便會繼續(resume),從異常處理點接着執行下去。函數

所謂異常(exception)是某種對象,最簡單的異常對象能夠設計爲整數或字符串。大部分時候,被拋出的異常都屬於特定的異常類(也許造成一個繼承體系)。spa

咱們能夠利用單條或一連串的catch字句來捕獲(catch)被拋出的異常對象。catch子句有三部分組成:關鍵字catch、小括號內的一個類型或對象、大括號內的一組語句(用以處理異常)。拋出的異常對象類型會被拿來逐一地和每一個catch子句比對。若是類型符合,那麼該catch子句的內容便會被執行,在經過全部catch子句以後,由正常程序從新接手。有時咱們可能沒法完成異常的完整處理過程,在記錄信息以外,咱們或許須要從新拋出(rethrow)異常,以尋求其它catch子句的協助,作進一步的處理,從新拋出時,只需寫下關鍵字throw便可,它只能出現於catch子句中,它會將捕獲的異常對象再一次拋出,並由另外一個類型符合的catch子句接手處理。若是咱們想要捕獲任何類型的異常,可使用一網打盡(catch-all)的方式,只需在異常聲明部分指定省略號(…)便可。設計

catch子句應該和try塊相應而生。try塊是以關鍵字try做爲開始,而後是大括號內的一連串程序語句。catch子句放在try塊的末尾,這表示若是try塊內有任何異常發生,便由接下來的catch子句加以處理。code

當函數的try塊發生某個異常,但並無相應的catch子句將它捕獲,此函數便會被中斷,由異常處理機制接管,沿着「函數調用鏈」一路回溯,搜尋符合條件的catch子句。若是「函數調用鏈」不斷被解開,一直回到main()仍是找不到合適的catch子句,變調用標準庫提供的terminate()——其默認行爲是中斷整個程序的執行。對象

練習題答案

練習7.3 爲練習5.2的Stack類體系加入兩個異常類型,處理「想從空stack中取出元素」和「想爲滿stack添加元素」兩種錯誤。請顯示修改後的pop()和push()。blog

定義PopOnEmpty和PushOnFull兩個異常類,分別供pop()和push()拋出。因而,Stack的全部member function就再也不須要返回表明成功或失敗的值了:繼承

void pop(elemType& elem)
{
    if (empty())
        throw PopOnEmpty;
    elem = _stack[--_top];
    _stack.pop_back();
}

void push(const elemType& elem)
{
    if (!full())
    {
        _stack.push_back(elem);
        ++_top;
        return;
    }
    throw PushOnFull();
}

爲了讓這兩個Stack異常能夠被徹底不知情的其它組件捕獲,它們應該融入StackException繼承體系中,後者又應該派生自標準庫所提供的logic_error class。ci

logic_error派生自exception。exception是標準庫的全部異常類別繼承體系的最根本抽象基類。這個繼承體系有一個名爲what()的虛函數,會返回const char*,用以表示被捕獲的異常究竟爲什麼。字符串

class StackException :public logic_error
{
public:
    StackException(const char* what) :_what(what) {}
    const char* what() const { return _what.c_str(); }

protected:
    string _what;
};

class PopOnEmpty :public StackException
{
public:
    PopOnEmpty() :StackException("Pop on Empty Stack") {}
};

class PushOnFull :public StackException
{
public:
    PushOnFull() :StackException("Push on Full Stack") {}
};

如下任何一個catch子句都可以處理類型爲PushOnFull的異常:string

catch (const PushOnFull & pof)
{
    log(pof.what());
    return;
}
catch (const StackException & stke)
{
    log(stke.what());
    return;
}
catch (const logic_error & lge)
{
    log(lge.what());
    return;
}
catch (const PushOnFull & ex)
{
    log(ex.what());
    return;
}

end。

「A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.」

相關文章
相關標籤/搜索