你是不是這樣寫異常處理代碼的呢?
經(jīng)常看到同事這樣寫代碼:
DataSet QueryDB()
{
DataSet ds=null;
try
{
//do something
}
catch (Exception ex)
{
//這里要做日志記錄
}
return ds;
}
這里有幾個問題:
1:很明顯,如果QueryDB方法發(fā)生了任何異常,客戶端無法得知,例如客戶端調(diào)用QueryDB方法,該方法返回了null,那這代表數(shù)據(jù)庫里面沒有這個數(shù)據(jù)呢?還是拋出了異常?
2:注釋是不應(yīng)該存在的,它應(yīng)該被真實的日志記錄代碼給替代,例如Log.Write(ex);
3:該方法捕捉所有異常,這樣任何異常都被捕獲了,這對于開發(fā)很不方便,永遠(yuǎn)不要捕獲你不能處理的異常。
4:為什么這樣寫代碼??解釋是:真實用戶不希望看到錯誤信息,初聽起來,好像有幾分道理,試想沒有哪個用戶會用你的軟件,然后老是拋出個異常什么的,但是這是部署之后的事情啊,而不是開發(fā)的程序員不希望看到異常啊。在開發(fā)的時候,如果能夠看到詳細(xì)的異常信息,那么可以很快的改正,修復(fù)Bug,何樂而不為之呢??
于是修改為如下:
DataSet QueryDB()
{
DataSet ds = null;
try
{
//do something
}
catch (Exception ex)
{
Log.Write(ex);
throw ex;
}
return ds;
}
好了,現(xiàn)在異??偹惚徊东@了,并且也被成功了拋出來了。
這段代碼還是有問題??
在catch語句塊中,throw ex; 最好修改為throw;
因為在.net中,異常都是不可修改的,每一次異常被拋出的時候,異常的堆棧跟蹤信息都會被重置,
Throw 不會重置堆棧跟蹤信息,但是throw ex;會重置。所以為了更方便的查找異常的拋出位置,最好使用throw 語句,而不是throw ex;否則clr會認(rèn)為異常是在catch語句塊中拋出的。
順便再說一句,不要捕獲你不能處理的異常,如果希望將來用戶看不到異常信息,
大可以使用AppDomain.或者Application的全局異常處理。
相關(guān)文章
C#?Windows?Forms中實現(xiàn)控件之間的連接線的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何在C#?Windows?Forms應(yīng)用程序中實現(xiàn)繪圖工具中多個控件之間的連接線功能,文中的示例代碼講解詳細(xì),需要的可以參考下2024-02-02C#實現(xiàn)控制Windows系統(tǒng)關(guān)機(jī)、重啟和注銷的方法
這篇文章主要介紹了C#實現(xiàn)控制Windows系統(tǒng)關(guān)機(jī)、重啟和注銷的方法,涉及C#調(diào)用windows系統(tǒng)命令實現(xiàn)控制開機(jī)、關(guān)機(jī)等操作的技巧,非常簡單實用,需要的朋友可以參考下2015-04-04C#使用TreeView控件實現(xiàn)的二叉樹泛型節(jié)點類及其方法
TreeView?控件在?C#?中主要用于顯示分層結(jié)構(gòu)的數(shù)據(jù),這通常是一個文件系統(tǒng)的表示,但也可以是任何具有父子關(guān)系的數(shù)據(jù)集合,本文給大家介紹了C#使用TreeView控件實現(xiàn)的二叉樹泛型節(jié)點類及其方法,需要的朋友可以參考下2024-03-03C#根據(jù)http和ftp圖片地址獲取對應(yīng)圖片
這篇文章主要為大家詳細(xì)介紹了C#根據(jù)http和ftp圖片地址獲取對應(yīng)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06