換句話說,C++為什么不提供一種簡單的方式,讓程序能夠回到異常拋出點之后,并繼續執行?
主要的原因是,如果從異常處理之后繼續,那么無法預知擲出點之后的代碼如何對待異常處理,是否僅僅繼續執行,就象什么也沒有發生一樣。異常處理者無法知道,在繼續之前,有關的上下文環境(context)是否是“正確”的。要讓這樣的代碼正確執行,拋出異常的編寫者與捕獲異常的編寫者必須對彼此的代碼與上下文環境都非常熟悉才行。這樣會產生非常復雜的依賴性,因此無論在什么情況下,都會導致一系列嚴重的維護問題。
當我設計C++的異常處理機制時,我曾經認真地考慮過允許這種繼續的可能性,而且在標準化的過程中,這個問題被非常詳細地討論過。請參見《C++語言的設計和演變》中的異常處理章節。
在一次新聞組的討論中,我曾經以一種稍微不同的方式回答過這個問題。
為什么C++中沒有相當于realloc()的函數?
如果你需要,你當然可以使用realloc()。但是,realloc()僅僅保證能工作于這樣的數組之上:它們被malloc()(或者類似的函數)分配,包含一些沒有用戶定義的復制構造函數(copy constructors)的對象。而且,要記住,與通常的期望相反,realloc()有時也必須復制它的參數數組。
在C++中,處理內存重新分配的更好的方法是,使用標準庫中的容器,例如vector,并讓它自我增長。
如何使用異常?
參見《C++程序設計語言》第4章,第8.3節,以及附錄E。這個附錄針對的是如何在要求苛刻的程序中寫出異常安全的代碼的技巧,而不是針對初學者的。一個關鍵的技術是“資源獲得即初始化”(resource acquisiton is initialization),它使用一些有析構函數的類,來實現強制的資源管理。
怎樣從輸入中讀取一個字符串?
你可以用這種方式讀取一個單獨的以空格結束的詞:
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please enter a word:\n";
string s;
cin>>s;
cout << "You entered " << s << ’\n’;
}
注意,這里沒有顯式的內存管理,也沒有可能導致溢出的固定大小的緩沖區。
如果你確實想得到一行而不是一個單獨的詞,可以這樣做:
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please enter a line:\n";
string s;
getline(cin,s);
cout << "You entered " << s << ’\n’;
}
在《C++程序設計語言》(可在線獲得)的第3章,可以找到一個對諸如字符串與流這樣的標準庫工具的簡介。對于使用C與C++進行簡單輸入輸出的詳細比較,參見我的文章《將標準C++作為一種新的語言來學習》(Learning Standard C++ as a New Language),你可以在本人著作列表(my publications list)中下載到它。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/