再谈异常处理try catch finally
1. 查找系统中坏味道的异常处理代码
在上篇文章杂谈异常处理try-catch-finally中主要详细介绍了C#异常处理的概念,异常设计准则,基础知识等方面的内容,但对如何正确使用异常处理印象还不是特别深刻吧。在这篇中,我通过查找以前系统代码中存在坏味道的异常处理代码来分析和讲解如何正确使用异常处理。
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; }
代码在异常设计是不是与“如果了解特定异常在给定上下文中引发的条件,请考虑捕捉这些异常。”或“捕捉并再次引发异常时,首选使用空引发。这是保留异常调用堆栈的最佳方式。”的要求不太相符合呢?把throw ex;改成throw;或throw new RepositoryLayerException("保存记录发生错误!", ex);是不是符合上面两条异常设计准则了呢?
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; }
领域层代码
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文本框输入的值经常超过200个字符,会不停的弹出错误消息框,这样是不是会引起效率问题,涉及到效率问题我们会想到什么,对了就是Tester-Doer 模式,呵呵,在这里我们怎么应用这个模式呢?其实很简单,我们只要设置this.XXName.MaxLength = 200;是不是就解决了这个问题?
1.3. 思考总结
认真去分析,会发现在系统中坏味道的代码还真不少,原来在异常处理中自认为比较正确的做法,比较优美的做法发现都是存在问题的。经过这几天对异常处理的系统学习研究,对系统中不好做法的异常处理进行排查,还是学到了不少知识,也发现自己的不足,原来很多基础技术知识还可以更上一层楼。
相关阅读:杂谈try-catch-finally异常处理,非常感谢大家一直以来对我们网站的支持。
上一篇:C#网页跳转方法总结
栏 目:C#教程
下一篇:C#获取远程XML文档的方法
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6768.html
您可能感兴趣的文章
- 01-10Extjs4如何处理后台json数据中日期和时间
- 01-10C#处理Access中事务的方法
- 01-10C#图片处理3种高级应用
- 01-10轻松学习C#的正则表达式
- 01-10轻松学习C#的异常处理
- 01-10杂谈try-catch-finally异常处理
- 01-10解析C#中断言与异常的应用方式及异常处理的流程控制
- 01-10详解C#编程中异常的创建和引发以及异常处理
- 01-10浅谈C#中简单的异常引发与处理操作
- 01-10C#异常处理中try和catch语句及finally语句的用法示例
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置