作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 例外處理的技巧?
時間Fri Dec 31 14:13:30 2010
※ 引述《icetofux ()》之銘言:
: 程式碼(Code): (請善用置底文標色功能)
: http://codepad.org/oQyBJLMx
: 補充說明(Supplement):
: 上面的程式碼是我參考其他網站用類別來做出陣列,其中37~46行的地方,我在使用者
: 發生違規取值時拋出一個例外,但是除了印出警告外,使用者還是可以取得一個我指
: 定的返回值0,我希望用更嚴謹的方式來處理類似的問題,比方說發生違規存取時直接
: 終止程式的執行,但是我不想把try、throw、catch拉到54行的for迴圈來處理,因為
: 這表示未來我在處理Get()成員函式都得加上冗長的例外處理。
: 請問有沒有其他方式可以達到我想要的效果呢?
: 謝謝
我猜你想做到的效果是這樣:當 Get() 越界的時候印出警告,並且終止程式
如果目的是這樣的話,程式碼其實很簡單:
int Array::Get(int Inx)
{
if(Inx>EndAddr){
cout<<"Input index: "<<Inx<<" over then array size!"<<endl;
throw Inx; // 如果Inx超過陣列大小,丟出例外。
}
return ArrPtr[Inx];
}
迴圈的地方不變
這麼一來只要使用者越界存取,
這個 exception 因為沒有被 catch 到
會直接中止程式執行
如果使用者不希望程式被中止
只要在迴圈外加上 try/catch 即可
不過建議你不要直接拿 int 當作 exception 物件
用 std::range_error 會比較好
然後你可以把警告訊息存在 exception 物件中
讓使用者自行決定如何顯示
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
推 icetofux:謝謝你,書中確實有提到throw沒被catch到程式就會中止, 12/31 14:22
→ icetofux:我漏看了。 12/31 14:23
→ loveme00835:std::range_error 是用來表示計算結果超出值域, 我覺 12/31 20:48
→ loveme00835:得用 out_of_range 比較好, STL containers也是這麼做 12/31 20:48
→ littleshan:嗯 我弄錯了 12/31 23:14