經常看到同僚這樣寫代碼:
這裡有幾個問題:
1:很明顯,如果QueryDB方法發生了任何異常,用戶端無法得知,例如用戶端調用QueryDB方法,該方法傳回了null,那這代表資料庫裡面沒有這個資料呢?還是抛出了異常?
2:注釋是不應該存在的,它應該被真實的日志記錄代碼給替代,例如Log.Write(ex);
3:該方法捕捉所有異常,這樣任何異常都被捕獲了,這對于開發很不友善,永遠不要捕獲你不能處理的異常。
4:為什麼這樣寫代碼??解釋是:真實使用者不希望看到錯誤資訊,初聽起來,好像有幾分道理,試想沒有哪個使用者會用你的軟體,然後老是抛出個異常什麼的,但是這是部署之後的事情啊,而不是開發的程式員不希望看到異常啊。在開發的時候,如果能夠看到詳細的異常資訊,那麼可以很快的改正,修複Bug,何樂而不為之呢??
于是修改為如下:
好了,現在異常總算被捕獲了,并且也被成功了抛出來了。
這段代碼還是有問題??
在catch語句塊中,throw ex; 最好修改為throw;
因為在.net中,異常都是不可修改的,每一次異常被抛出的時候,異常的堆棧跟蹤資訊都會被重置,
Throw 不會重置堆棧跟蹤資訊,但是throw ex;會重置。是以為了更友善的查找異常的抛出位置,最好使用throw 語句,而不是throw ex;否則clr會認為異常是在catch語句塊中抛出的。
順便再說一句,不要捕獲你不能處理的異常,如果希望将來使用者看不到異常資訊,
大可以使用AppDomain.或者Application的全局異常處理。
本文轉自LoveJenny部落格園部落格,原文連結:http://www.cnblogs.com/LoveJenny/archive/2011/06/30/2093976.html,如需轉載請自行聯系原作者