再談異常處理try catch finally
1. 查找系統(tǒng)中壞味道的異常處理代碼
在上篇文章雜談異常處理try-catch-finally中主要詳細(xì)介紹了C#異常處理的概念,異常設(shè)計準(zhǔn)則,基礎(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)用堆棧的最佳方式?!钡囊蟛惶喾夏兀堪裻hrow ex;改成throw;或throw new RepositoryLayerException("保存記錄發(fā)生錯誤!", ex);是不是符合上面兩條異常設(shè)計準(zhǔn)則了呢?
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é)
認(rèn)真去分析,會發(fā)現(xiàn)在系統(tǒng)中壞味道的代碼還真不少,原來在異常處理中自認(rèn)為比較正確的做法,比較優(yōu)美的做法發(fā)現(xiàn)都是存在問題的。經(jīng)過這幾天對異常處理的系統(tǒng)學(xué)習(xí)研究,對系統(tǒng)中不好做法的異常處理進(jìn)行排查,還是學(xué)到了不少知識,也發(fā)現(xiàn)自己的不足,原來很多基礎(chǔ)技術(shù)知識還可以更上一層樓。
相關(guān)閱讀:雜談try-catch-finally異常處理,非常感謝大家一直以來對我們網(wǎng)站的支持。
上一篇:C#網(wǎng)頁跳轉(zhuǎn)方法總結(jié)
欄 目:C#教程
本文標(biāo)題:再談異常處理try catch finally
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6768.html
您可能感興趣的文章
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#處理Access中事務(wù)的方法
- 01-10C#圖片處理3種高級應(yīng)用
- 01-10輕松學(xué)習(xí)C#的正則表達(dá)式
- 01-10輕松學(xué)習(xí)C#的異常處理
- 01-10雜談try-catch-finally異常處理
- 01-10解析C#中斷言與異常的應(yīng)用方式及異常處理的流程控制
- 01-10詳解C#編程中異常的創(chuàng)建和引發(fā)以及異常處理
- 01-10淺談C#中簡單的異常引發(fā)與處理操作
- 01-10C#異常處理中try和catch語句及finally語句的用法示例


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置