再谈异常处理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++异常处理入门,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09
- 这篇文章首先给大家介绍了关于C#中try...catch的语法,而后又给大家分享了关于C#中try...catch最常见的面试题,具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧。...2020-06-25
- 这篇文章主要介绍了如何使用Sentry 监控你的Spring Boot应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-09
- 这篇文章主要介绍了Java catch与throw同时使用的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25
- 最近,自己利用放假时间学PHP,可能大家都不知道PHP是什么呢?PHP是一种网页嵌入式语言,就同ASP,JSP一样,这应该是编程中最容易学习的语言。前几年自己在华师上夜大...2016-11-25
- 这篇文章主要介绍了php中try catch捕获异常实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-07
- 这篇文章主要介绍了java:try...catch跳过异常继续处理循环问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-02
SpringBoot整合spring-retry实现接口请求重试机制及注意事项
今天通过本文给大家介绍我们应该如何使用SpringBoot来整合spring-retry组件实现重试机制及注意事项,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧...2021-08-14- 下面小编就为大家带来一篇浅谈PHP中try{}catch{}的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-01-08
- 今天小编就为大家分享一篇关于Java异常处理之try...catch...finally详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2021-09-08
JavaScript语句错误throw、try及catch实例解析
这篇文章主要介绍了JavaScript语句错误throw、try及catch实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-19- .net 一些无法catch的异常,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了PHP Try-catch 语句使用技巧,需要的朋友可以参考下...2016-03-02
- catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常 对象更好的控制手段,使开发的软件系统有很好的可靠性...2020-04-25
浅谈Java中Map和Set之间的关系(及Map.Entry)
这篇文章主要介绍了浅谈Java中Map和Set之间的关系(及Map.Entry),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-24- 这篇文章主要介绍了Android捕捉错误try catch 的简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-19
- 这篇文章主要给大家介绍了关于C++中try throw catch异常处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-25
- 这篇文章主要介绍了java 异常被catch后 将会继续执行的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-24
- 这篇文章主要介绍了杂谈try-catch-finally异常处理的相关资料,需要的朋友可以参考下...2020-06-25
Java try()语句实现try-with-resources异常管理机制操作
这篇文章主要介绍了Java try()语句实现try-with-resources异常管理机制操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-19