国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

你是不是這樣寫異常處理代碼的呢?

2020-01-24 03:20:21
字體:
來源:轉載
供稿:網友

經常看到同事這樣寫代碼:

復制代碼 代碼如下:

DataSet QueryDB()
{
   DataSet ds=null;

   try
    {
         //do something
    }
    catch (Exception ex)
    {
         //這里要做日志記錄
    }

    return ds;
}


這里有幾個問題:

1:很明顯,如果QueryDB方法發生了任何異常,客戶端無法得知,例如客戶端調用QueryDB方法,該方法返回了null,那這代表數據庫里面沒有這個數據呢?還是拋出了異常?

2:注釋是不應該存在的,它應該被真實的日志記錄代碼給替代,例如Log.Write(ex);

3:該方法捕捉所有異常,這樣任何異常都被捕獲了,這對于開發很不方便,永遠不要捕獲你不能處理的異常。

4:為什么這樣寫代碼??解釋是:真實用戶不希望看到錯誤信息,初聽起來,好像有幾分道理,試想沒有哪個用戶會用你的軟件,然后老是拋出個異常什么的,但是這是部署之后的事情啊,而不是開發的程序員不希望看到異常啊。在開發的時候,如果能夠看到詳細的異常信息,那么可以很快的改正,修復Bug,何樂而不為之呢??

于是修改為如下:

復制代碼 代碼如下:

DataSet QueryDB()
{
     DataSet ds = null;

     try
     {
           //do something
     }
     catch (Exception ex)
     {
          Log.Write(ex);
          throw ex;
      }

      return ds;
}


好了,現在異常總算被捕獲了,并且也被成功了拋出來了。

這段代碼還是有問題??

在catch語句塊中,throw ex; 最好修改為throw;

因為在.net中,異常都是不可修改的,每一次異常被拋出的時候,異常的堆棧跟蹤信息都會被重置,

Throw 不會重置堆棧跟蹤信息,但是throw ex;會重置。所以為了更方便的查找異常的拋出位置,最好使用throw 語句,而不是throw ex;否則clr會認為異常是在catch語句塊中拋出的。

順便再說一句,不要捕獲你不能處理的異常,如果希望將來用戶看不到異常信息,

大可以使用AppDomain.或者Application的全局異常處理。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东明县| 内丘县| 工布江达县| 杭锦旗| 蒙山县| 武强县| 龙井市| 呼伦贝尔市| 沅陵县| 太仓市| 宁强县| 壶关县| 哈尔滨市| 广元市| 华坪县| 榆林市| 雅安市| 利辛县| 木兰县| 仙桃市| 乳山市| 南京市| 维西| 长宁县| 盐城市| 大渡口区| 田阳县| 西和县| 辰溪县| 石阡县| 都匀市| 洛隆县| 搜索| 桐城市| 固镇县| 保德县| 喀喇| 信阳市| 湘西| 故城县| 乳山市|