软件编程
位置:首页>> 软件编程>> C#编程>> 再谈异常处理try catch finally

再谈异常处理try catch finally

作者:至软  发布时间:2021-11-12 11:17:31 

标签: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. 思考总结

认真去分析,会发现在系统中坏味道的代码还真不少,原来在异常处理中自认为比较正确的做法,比较优美的做法发现都是存在问题的。经过这几天对异常处理的系统学习研究,对系统中不好做法的异常处理进行排查,还是学到了不少知识,也发现自己的不足,原来很多基础技术知识还可以更上一层楼。

0
投稿

猜你喜欢

  • Mybatis防止sql注入原理SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL 语句 * 入到执行的实体字段中(例如,为
  • 本文实例为大家分享了java实现面板之间切换的具体代码,供大家参考,具体内容如下如图:关键技术:事件监听,设置显示面板,重新刷新验证。set
  • 前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常例如:NullPo
  • 一、实现方式@ConfigurationProperties 注解(最好加上前缀prefix=“person”,标明是和配置文件中哪个开头的
  • Servlet 实现文件上传所谓文件上传就是将本地的文件发送到服务器中保存。例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务
  • 1.定义多态是同一个行为具有多个不同表现形式或形态的能力。多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口
  • 1. 什么是单例模式单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的
  • 在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用
  • 一、@Configuration注解1、基本使用自定义配置类/** * 1、@Configuration 告诉SpringBoot这是一个配
  • 首先说明这是我一个不熟悉idea和SSM框架的新手小白遇到的坑,适合用idea搭建SSM框架的小伙伴看一看,老鸟就不用看了。以下为详细步骤(
  • 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。例如:&
  • 使用java来实现一个简单的计算器,供大家参考,具体内容如下最近使用java制作了一个计算器,菜单栏里的功能没有实现,只是写一个版式,仅仅实
  • 背景Arthas是阿里巴巴开源的应用诊断利器,提供了profiler命令,可以生成热点火焰图。通过采样录制调用链路来做性能分析,极大提升了线
  • 前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本
  • 本文实例为大家分享了flutter日期时间选择器的具体代码,供大家参考,具体内容如下1 日期选择器 //设置默认显示的日期为当前 DateT
  • 今天在QQ空间看到一篇关于C#语言验证18位身份证号码的验证方法和实例代码,抽了些时间学习了一下,个人觉得还不错,所以把它记了下来,方便以后
  • 一、使用swing嵌套浏览器要实现的功能:通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出
  • 今天再学习一些C#的基础知识,如对 Int Array进行排序:你可以在控制台应用程序中,创建一个类别,它属性和2个构造函数:Source
  • 我们平时在开发系统时,一般我们的系统工程会被分为多个模块,一个原因是方便协同开发,系统间解耦,另外一个很重要的原因是:别的系统需要依赖我们系
  • 一、系统介绍本系统实现的以下功能管理员功能:登录系统、病人信息的增删改查、就医档案的录入、医生信息的增删改查、科室信息的增删改查、收费统计功
手机版 软件编程 asp之家 www.aspxhome.com