再談異常處理try catch finally
1. 查找系統(tǒng)中壞味道的異常處理代碼
在上篇文章雜談異常處理try-catch-finally中主要詳細介紹了C#異常處理的概念,異常設(shè)計準則,基礎(chǔ)知識等方面的內(nèi)容,但對如何正確使用異常處理印象還不是特別深刻吧。在這篇中,我通過查找以前系統(tǒng)代碼中存在壞味道的異常處理代碼來分析和講解如何正確使用異常處理。
1.1. 例一
/// <summary> /// 保存記錄 /// </summary> /// <param name="entity">實體</param> public virtual object Save(T entity) { ISession session = NHibernateUtils.GetCurrentSession(); ITransaction tx = null; try { tx = session.BeginTransaction(); object id = session.Save(entity); tx.Commit(); return id; } catch (HibernateException ex) { if (tx != null) tx.Rollback(); throw ex; } finally { NHibernateUtils.CloseSession(); } }
上面代碼中其中
catch (HibernateException ex) { if (tx != null) tx.Rollback(); throw ex; }
代碼在異常設(shè)計是不是與“如果了解特定異常在給定上下文中引發(fā)的條件,請考慮捕捉這些異常?!被颉安蹲讲⒃俅我l(fā)異常時,首選使用空引發(fā)。這是保留異常調(diào)用堆棧的最佳方式。”的要求不太相符合呢?把throw ex;改成throw;或throw new RepositoryLayerException("保存記錄發(fā)生錯誤!", ex);是不是符合上面兩條異常設(shè)計準則了呢?
1.2. 例二
表示層代碼
try { Cursor = Cursors.WaitCursor; IApplicationContext ctx = ContextRegistry.GetContext(); IStoreRepository storeRepository = ctx.GetObject("StoreRepository") as IStoreRepository; StoreInfo store = Store; store.Name = XXName.Text.Trim(); storeRepository.Save(store); } catch (Exception ex) { ShowMessageBox(ex, MessageLevel.Error); } finally { Cursor = Cursors.Arrow; }
領(lǐng)域?qū)哟a
private string _name; /// <summary> /// 店鋪名稱 /// </summary> public virtual string Name { set { if (string.IsNullOrEmpty(value)) { throw new ArgumentNullException("value", "店鋪名稱不能為空!"); } if (ValidationUtils.GetLength(value,CharacterType.NVarChar) > 200) { throw new ArgumentOutOfRangeException("value", "店鋪名稱不能大于200!"); } _name = value; } get { return _name; } }
在這里需要說明一下,其中XXName是一個文本框控件,如果XXName文本框輸入的值經(jīng)常超過200個字符,會不停的彈出錯誤消息框,這樣是不是會引起效率問題,涉及到效率問題我們會想到什么,對了就是Tester-Doer 模式,呵呵,在這里我們怎么應(yīng)用這個模式呢?其實很簡單,我們只要設(shè)置this.XXName.MaxLength = 200;是不是就解決了這個問題?
1.3. 思考總結(jié)
認真去分析,會發(fā)現(xiàn)在系統(tǒng)中壞味道的代碼還真不少,原來在異常處理中自認為比較正確的做法,比較優(yōu)美的做法發(fā)現(xiàn)都是存在問題的。經(jīng)過這幾天對異常處理的系統(tǒng)學(xué)習(xí)研究,對系統(tǒng)中不好做法的異常處理進行排查,還是學(xué)到了不少知識,也發(fā)現(xiàn)自己的不足,原來很多基礎(chǔ)技術(shù)知識還可以更上一層樓。
相關(guān)閱讀:雜談try-catch-finally異常處理,非常感謝大家一直以來對腳本之家網(wǎng)站的支持。
相關(guān)文章
C#獲取真實IP地址(IP轉(zhuǎn)為長整形、判斷是否內(nèi)網(wǎng)IP的方法)
這篇文章主要介紹了C#獲取真實IP地址的實現(xiàn)代碼,包含把IP轉(zhuǎn)為長整形、判斷是否是私網(wǎng)、內(nèi)網(wǎng)IP的方法,需要的朋友可以參考下2014-08-08C#實現(xiàn)文件與Base64的相互轉(zhuǎn)換
本文主要介紹了C#實現(xiàn)文件與Base64的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06支持windows與linux的php計劃任務(wù)的實現(xiàn)方法
這篇文章主要介紹了支持windows與linux的php計劃任務(wù)的實現(xiàn)方法,較為詳細的講述了php計劃任務(wù)中涉及到的php程序?qū)崿F(xiàn)方法、Windows計劃任務(wù)實現(xiàn)方法等,需要的朋友可以參考下2014-11-11.NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實例方法
.NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實例方法,需要的朋友可以參考一下2013-03-03C#/VB.NET實現(xiàn)創(chuàng)建PDF/UA文件的示例代碼
PDF/UA,即Universally?Accessible?PDF,該格式的PDF文件是于2012年8月以ISO標準14289-1發(fā)布的、具有普遍可訪問的PDF文檔標準。本文將用C#實現(xiàn)DF/UA文件的創(chuàng)建,需要的可以參考一下2022-08-08WinForm中BackgroundWorker控件用法簡單實例
這篇文章主要介紹了WinForm中BackgroundWorker控件用法,以一個簡單實例形式分析了BackgroundWorker控件的定義、設(shè)置及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08