再谈异常处理try catch finally

 更新时间:2016年01月13日 11:24:01   作者:至软  
这篇文章主要介绍了再谈异常处理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#实现DataTable数据行列转换

    C#实现DataTable数据行列转换

    这篇文章介绍了C#实现DataTable数据行列转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 详解C# 反射(Reflection)

    详解C# 反射(Reflection)

    这篇文章主要介绍了C# 反射(Reflection)的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Unity使用物理引擎实现多旋翼无人机的模拟飞行

    Unity使用物理引擎实现多旋翼无人机的模拟飞行

    这篇文章主要介绍了Unity使用物理引擎实现多旋翼无人机的模拟飞行,包括了详细的原理介绍和代码实现,对物理引擎感兴趣的同学,可以参考下
    2021-04-04
  • Unity实现首字母检索器

    Unity实现首字母检索器

    这篇文章主要为大家详细介绍了Unity实现首字母检索器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C#中使用Split方法拆分字符串实例

    C#中使用Split方法拆分字符串实例

    这篇文章主要介绍了C#中使用Split方法拆分字符串实例,本文给出了使用一个分隔符和多个分隔符拆分字符串的例子,需要的朋友可以参考下
    2014-08-08
  • c#使用windows服务更新站点地图的详细示例

    c#使用windows服务更新站点地图的详细示例

    这篇文章主要介绍了c#使用windows服务更新站点地图的详细示例,需要的朋友可以参考下
    2014-04-04
  • C#操作注册表的方法

    C#操作注册表的方法

    以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作
    2007-03-03
  • C#编程实现向并口设备发送指令、获取并口设备的状态

    C#编程实现向并口设备发送指令、获取并口设备的状态

    这篇文章主要介绍了C#编程实现向并口设备发送指令、获取并口设备的状态,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • C# 线程同步的方法

    C# 线程同步的方法

    这篇文章主要介绍了C# 线程同步的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Unity 读取文件 TextAsset读取配置文件方式

    Unity 读取文件 TextAsset读取配置文件方式

    这篇文章主要介绍了Unity 读取文件 TextAsset读取配置文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论