經驗分享,如何使用try,catch, throw之一
try,catch, throw的含義就很清楚,但怎麼使用,我還是過了好多年才明白一些
先看乙個不好的例子
c/c++ code
//----------------- 不好的** -----------------
class
ctest1;
class
ctest2;
class
ctest3;
void
badcode()
//new ctest2
ctest2
*ptest2
=new
ctest2;
//do something
bret
=dosomething();
if(!
bret)
//new ctest3
ctest3
*ptest3
=new
ctest3;
//do something
bret
=dosomething();
if(!
bret)
//release
delete ptest1;
delete ptest2;
delete ptest3;
}
下面是我個人比較喜歡的寫法
c/c++ code
//--------- 好的例子 ---------------
class
ctest1;
class
ctest2;
class
ctest3;
void
mycode()
catch
(...)
}另外在乙個函式裡不僅僅只有乙個try,
catch
。可以有多個。比如:
//--------- 多個try的例子 ---------------
class
ctest1;
class
ctest2;
class
ctest3;
void
mycode()
catch
(...)
if(ptest1)
delete ptest1;
try
catch
(...)
if(ptest2)
delete ptest2;
try
catch
(...)
if(ptest3)
delete ptest3;
}
簡單說一下
第一種寫法,需要在不同的地方delete 不同的變數
第二種寫法,在catch裡delete所有的變數,**的結構看起來更容易讀,也易於維護
//define
ctest1 * ptest1 = null;
ctest2 * ptest2 = null;
ctest3 * ptest3 = null;
變數定義一定要在try之前定義,否則catch裡找不到這些變數的定義
另外很重要的一點,在delete之後必須將變數設成null
catch裡的delete可以刪掉
把try裡的delete放catch後,因為指標都初始化null了
經驗分享,如何使用try,catch, throw之二
什麼時候使用try,catch,什麼時候不用;什麼時候用throw,什麼時候不用。工作了很多年才明白。
我個人的理解是:
1。在private或者protected的成員函式不使用try,catch,而只使用throw
2。如果在private或者protected的成員函式需要使用try,catch,那麼就要使用rethrow
3。在public成員函式裡使用try,catch
4。如果該類相對於整個專案來說是屬於被呼叫層,那麼public成員函式也可以不使用try,catch
5。如果呼叫第三方的**,我一般都會用try,catch
我個人的習慣是把private或者protected成員函式的名字使用字首__,public函式不用
先看乙個我不喜歡的寫法
c/c++ code
//------------- try, catch, throw 例子,不喜歡的寫法 ------------
class
ctest //
--------- init ------------
intctest:init()
catch
(int
&err)
} //---------- __inita ----------
intctest::__inita()
catch
(int
&err)
} __initb, ___initc和___inita類似
下面是我個人比較喜歡的寫法
c/c++ code
//------------- try, catch, throw 例子,喜歡的寫法 ------------
class
ctest //
--------- init ------------
intctest:init()
catch
(int
&err)
} //---------- __inita ----------
intctest::__inita()
__initb, ___initc和___inita類似
我喜歡的寫法是private或者protected函式沒有try,catch,只有throw
在public函式就不需要去判斷每個private或者protected函式的返回值了
看起來會更清楚一點
如果在private或者protected的成員函式需要使用try,catch,那麼就要再throw,而不是呼叫return
回想一下windows的win32函式,返回有2種方式
一種是返回乙個錯誤值
另外一種就是丟擲異常
在我自己的設計中,什麼時候返回值什麼時候丟擲異常,很值得推敲一下
編譯時如何使用庫 zz
l引數就是用來指定程式要鏈結的庫,l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。好了現在我們知道怎麼得到庫名了,比如我們自已要用到乙個第三方提供的庫名字叫libtest.so...
myccl初次使用(zz)
修改特徵 免殺一般分為檔案和記憶體二種,我們要先查詢檔案特徵碼進行免殺 表面免殺 然後才可以查詢記憶體特徵 進行免殺。給木馬加殼 加花 加密,這樣檔案 表面 免殺了,不等於檔案特徵碼免殺。操作步驟 首先我們要生成乙個無殼的木馬客戶端,我已經生成好了。開啟 myccl 復合特徵碼定位器軟體,把我們要查...
教你如何成為專家zz
一 不管別人提什麼千奇百怪的問題,你都要回答 這很正常。這樣做的好處是,既說明了自己見多識廣,又能說明別人少見多怪,從而確立自己的專家地位。例如 有人問 為什麼汶川 我們國家的 局,沒有任何的 你可以說 這很正常,是世界性難題。有人問 為什麼 中學校的校舍倒塌的那麼多。你可以說 這很正常,的強度超過...