再谈异常处理try catch finally
作者:至软 发布时间:2021-11-12 11:17:31
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. 思考总结
认真去分析,会发现在系统中坏味道的代码还真不少,原来在异常处理中自认为比较正确的做法,比较优美的做法发现都是存在问题的。经过这几天对异常处理的系统学习研究,对系统中不好做法的异常处理进行排查,还是学到了不少知识,也发现自己的不足,原来很多基础技术知识还可以更上一层楼。


猜你喜欢
- 目录一、字节码文件 与 JVM二、字节码文件示例三、字节码文件二进制结构分析1、魔数2、次版本号3、主版本号4、常量池个数总结一、字节码文件
- 效果图国际惯例,先看效果图:具体效果就是吃豆人会根据吃不同颜色的豆子改变身体的颜色。绘制静态吃豆人、豆豆、眼睛首先,我们需要将这个静态的吃豆
- java模拟TCP通信实现客户端上传文件到服务器端,供大家参考,具体内容如下客户端package com.zr;import java.io
- 前几天,收到 AS 发布的 3.0 更新,就迫不及待的更新了,更新后发现整个界面的画风都变了,和 IDEA 更像了本人是命令行重度使用患者,
- 前言为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能
- 查看最新消息要用到类似新浪微博下拉刷新 功能!把最新的消息显示在最上面! 代码如下: PullToRefreshListView类代码 pa
- DateTime.Now.ToString("dddd",new System.Globalization.Cultur
- dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有
- RMI 介绍RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中
- Java 里的 * 是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也
- spinner组件有点类型于HTML中的下拉框<Select></select>的样子,让用户每次从下拉框中选取一个
- c#做公司的应用级开发时,导出数据这个是经常要做的,公司使用的是一个叫NPOI的组件。具体是什么我就不很清楚,反正这样用就是了。具体的dll
- 一、什么是 RestTemplate?RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK Ht
- Map是键值对的集合,又叫作字典或关联数组等,是最常见的数据结构之一。在java如何让一个map按value排序呢? 看似简单,但却不容易!
- 关于 swagger 本文不再赘述,网上文章很多。本文要讲的是Knife4j3.0.3 整合SpringBoot 2.6.4,因为 knif
- Java调用Oracle存储过程详解步骤:1、编写Oracle存储过程2、编写数据库获取连接工具类3、编写简单应用调用存储过程实现:1、Or
- 本文实例为大家分享了Java实现学生管理系统的具体代码,供大家参考,具体内容如下1.学生管理系统(控制台界面实现)//学生类,继承Seria
- 首先,引入依赖:<dependency> <groupId>org.springframe
- Android Notification的多种用法总结我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏
- C# 中可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。1. 什么是局部类型?C# 2.0 引入