Re: [問題] 例外處理的技巧?

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間15年前 (2010/12/31 14:13), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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

12/31 14:22, , 1F
謝謝你,書中確實有提到throw沒被catch到程式就會中止,
12/31 14:22, 1F

12/31 14:23, , 2F
我漏看了。
12/31 14:23, 2F

12/31 20:48, , 3F
std::range_error 是用來表示計算結果超出值域, 我覺
12/31 20:48, 3F

12/31 20:48, , 4F
得用 out_of_range 比較好, STL containers也是這麼做
12/31 20:48, 4F

12/31 23:14, , 5F
嗯 我弄錯了
12/31 23:14, 5F
文章代碼(AID): #1D7NID9q (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1D7NID9q (C_and_CPP)