zz 如何使用try,catch, throw

2021-04-29 00:28:37 字數 3430 閱讀 3500

經驗分享,如何使用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

一 不管別人提什麼千奇百怪的問題,你都要回答 這很正常。這樣做的好處是,既說明了自己見多識廣,又能說明別人少見多怪,從而確立自己的專家地位。例如 有人問 為什麼汶川 我們國家的 局,沒有任何的 你可以說 這很正常,是世界性難題。有人問 為什麼 中學校的校舍倒塌的那麼多。你可以說 這很正常,的強度超過...