我只是一個初出茅廬的程序員,至少試圖編程比最好的情況更多。我一直在閱讀Herb Sutter的「Exceptional C++」,並且迄今爲止已經進行了三次異常安全章節的討論。然而,除了他提出的例子(一個Stack)之外,我不確定什麼時候我應該爭取異常安全與速度,以及什麼時候這很簡單。例外安全 - 何時,如何,爲什麼?
例如,我目前的家庭作業項目是一個雙向鏈接列表。既然我已經編寫了其中的一些,我想花時間去深入一些更深入的概念,比如ES。
這裏是我的彈出式前功能:
void List::pop_front()
{
if(!head_)
throw std::length_error("Pop front: List is empty.\n");
else
{
ListElem *temp = head_;
head_ = head_->next;
head_->prev = 0;
delete temp;
--size_;
}
}
我遇到了一些難題與此有關。
1)列表失敗時,我真的應該拋出一個錯誤嗎?我不應該寧願乾脆不做任何事情,而是返回而不是強迫列表的用戶執行try {] catch(){}語句(這也是很慢的)。
2)有多個錯誤類(加上我的老師要求我們在課堂上實現的ListException)。對於這樣的事情是否真的需要一個自定義的錯誤類,並且在何時使用特定的異常類時是否有一個通用指南? (例如,範圍,長度和邊界全部聲音相似)
3)我知道我不應該改變程序狀態,直到所有引發異常的代碼都完成爲止。這就是爲什麼我最後減小尺寸。這個簡單的例子真的有必要嗎?我知道刪除不能扔。分配給0時head_-> prev是否可能拋出? (頭的第一個節點)
我的push_back功能:
void List::push_back(const T& data)
{
if(!tail_)
{
tail_ = new ListElem(data, 0, 0);
head_ = tail_;
}
else
{
tail_->next = new ListElem(data, 0, tail_);
tail_ = tail_->next;
}
++size_;
}
1)我聽到常常是任何可以在C++程序失敗。測試ListElem的構造函數是否失敗(或在new
ing期間尾部)是否現實?
2)是否有必要測試數據類型(目前簡單的typedef int T
,直到我對所有東西進行模板化)以確保該類型對結構可行?
我意識到這些都是過於簡單的例子,但我現在只是混淆了什麼時候應該實際練習好的ES,以及什麼時候沒有。
我覺得'push_back'有一個bug。如果列表爲空,它會在列表中插入'data'兩次,但只增加一次'size' ... – 2010-12-19 12:14:50
是的,肯定缺少'else'和一些大括號。 ;)我的回答是基於這個假設得到解決的。 – 2010-12-19 12:18:45
+1。這個問題應該重新編制並放入C++ - faq標籤中。大多數人或者不知道安全是什麼例外,或者對安全有誤解,而其他人可能希望記憶更新。 – 2010-12-19 12:50:17