a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2020-01-24 03:20:21
字體:
供稿:網(wǎng)友

經(jīng)常看到同事這樣寫代碼:

復(fù)制代碼 代碼如下:

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,何樂而不為之呢??

于是修改為如下:

復(fù)制代碼 代碼如下:

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的全局異常處理。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品成人3p一区二区三区 | 午夜av成人 | 欧美中文在线 | 欧美视频免费 | 亚洲国产日本 | 欧美成人免费在线视频 | 久久99精品久久久久久琪琪 | 国产黑人在线 | 久草视频在线看 | 国产精品免费在线 | 欧美日韩一区精品 | 成人在线播放 | 久久久蜜桃一区二区人 | 一级在线毛片 | 亚洲欧美视频一区 | 免费精品视频在线观看 | 日本免费视频在线观看 | 一区二区av在线 | 精品久久久久久久久久久久久久 | 三级视频在线 | 99热影院 | 97在线视频免费 | 91tv亚洲精品香蕉国产一区 | 国产裸体永久免费视频网站 | 日韩一区二区在线观看视频 | 亚洲精品乱码 | 国产aⅴ爽av久久久久 | 久久精品久久久久电影 | 欧美一区二区国产 | 男女羞羞视频免费在线观看 | 亚洲视频成人 | 国产精品视频一区二区免费不卡 | 亚洲精品一区中文字幕乱码 | 2018啪一啪 | 国产精品久久久久久久久久免费 | 久久国产高清 | 日日干天天操 | 日韩一区中文字幕 | 精品国产第一国产综合精品 | 在线一区二区三区 | 国产综合一区二区 |