try catch throw php搜集
我個人的理解是:?
1。在private或者protected的成員函數不使用try,catch,而只使用throw?
2。如果在private或者protected的成員函數需要使用try,catch,那麼就要使用rethrow?
3。在public成員函數裡使用try,catch?
4。如果該類相對於整個項目來說是屬於被調用層,那麼public成員函數也可以不使用try,catch?
5。如果調用第三方的代碼,我一般都會用try,catch?
class CTest1;?
class CTest2;?
class CTest3;?
void BadCode()?
{?
? //define?
? CTest1 * pTest1 = NULL;?
? CTest2 * pTest2 = NULL;?
? CTest3 * pTest3 = NULL;?
? //使用try, catch, throw?
? try?
? {?
? ? //new test1?
? ? pTest1 = new CTest1;?
? ? //do something?
? ? bool bRet = DoSomething();?
? ? if (!bRet)?
? ? ? throw -1;?
? ? //new CTest2?
? ? pTest2 = new CTest2;?
? ? //do something?
? ? bRet = DoSomething();?
? ? if (!bRet)?
? ? ? throw -2;?
? ? //new CTest3?
? ? pTest3 = new CTest3;?
? ? bRet = DoSomething();?
? ? //do something?
? ? if (!bRet)?
? ? ? throw -3;?
? ? //release?
? ? delete pTest1;?
? ? pTest1 = NULL;?
? ? delete pTest2;?
? ? pTest2 = NULL;?
? ? delete pTest3;?
? ? pTest3 = NULL;?
? }?
? catch(...)?
? {?
? ? if (pTest1)?
? ? ? delete pTest1;?
? ? if (pTest2)?
? ? ? delete pTest2;?
? ? if (pTest3)?
? ? ? delete pTest3;?
? }?
}
//-----------------------------------------------------------------------
try
{
..........
.........
//throw
}
catch (int x)
{
.......
}
(1)如果在try中沒有throw拋出異常 是不是catch 就捕獲不到異常啦? throw不可能莫名其妙拋出異常吧 總要判斷下吧!
比如if(..)的 這樣的話 要這些try catch幹什嗎?多此一舉? 直接if語句後面寫就的啦!
(2)如果try中沒有throw, 哪麼catch 會捕獲到異常嗎?怎麼捕獲的?這一點很不明白! 如果try中發生異常 哪麼到底誰通知catch呢?
(3) throw到底能幹什麼?
. 如果try裡面調用了某個庫函數,那個函數throw了異常,就會在這裡被catch。這種情況自己就沒法判斷
throw產生一個異常,這個異常會順著函數調用的層級逐級向上,由最接近的一個catch來處理。如果一直沒有catch,最後就被作業系統捕捉到
1.首先,有的異常的是否拋出不是程式員能控制的,比如記憶體耗盡,所以需要try...catch,另外,有的時候需要通過拋出異常在程式的其他地方進行 處理,因為當前上下文缺少處理該異常的資訊,所以程式員可以自訂異常,並在某種情況下拋出該異常,外層代碼需要try...catch來捕獲該異常
2.try塊裡的代碼可能沒有顯示拋出異常,但裡面調用的函數有可能拋出異常;怎麼捕獲的就涉及到異常處理系統的實現,具體的還是由牛人們來解答吧
3.throw就是拋出指定的異常,該異常可以在程式的其他地方被捕獲並處理,當然也可能始終沒有被捕獲,此時,程式一般立刻終止,退出
試想,你寫的一個方法method()給別人調用,你知道那個方法執行可能會出錯,當出錯的時候,你需要把錯誤資訊返回給調用者。這時候,你就只能用throw拋出錯誤。調用者把對method()的調用放在try塊裡,就能catch到你拋出的錯誤,從而獲得錯誤資訊。
(1)
???
try的程式碼片段假如沒有拋出異常(可能是調用的函數拋出異常),catch確實捕獲不到異常;用try catch而不用if能夠很快的跳出深層嵌套啊。能夠讓代碼更清晰。
(2)
1裡提到了可以捕獲深層異常,假如調用的函數中拋出了異常,c++會沿調用鏈向上回溯(不是通過return回溯),找到第一個try塊,
然 後找到對應的catch,假如該異常能被catch處理(類型匹配,其中...處理所有異常),則catch塊處理該異常,然後按正常程式繼續走下去,回 到正常的函數調用返回鏈。假如一直找不到一個try,catch塊,就會調用C++的“未處理異常捕獲器”,這個函數指標是可以設定的,他的預設行為是終 止程式。
(3) throw的用處是拋出異常,正常的返回用return,而異常用throw。這樣程式可以集中處理傳回值(這裡的傳回值不同於C,每個傳回值都是正確的,只是含義不同,而C的傳回值可能代表著錯誤),而錯誤集中在catch塊處理,代碼邏輯會更清晰明了