编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常相关的知识,希望对你有一定的参考价值。

 

建议67:慎用自定义异常

 除非有充分的理由,否则不要创建自定义异常。如果要对某类程序出错做特殊处理,那就自定义异常。需要自定义异常的理由如下:

1)方便测试。通过抛出一个自定义的异常类型实例,我们可以使捕获的代码精确的知道所发生的事情,并以符合的方式进行恢复。

2)逻辑包装。自定义异常可以包装多个其他异常,然后抛出一个业务异常。

3)方便调用者编码。在编写自己的类库或者业务层代码的时候,自定义异常可以让调用方更方便处理业务逻辑。例如,保存数据失败可以分成两个异常“数据库连接失败”和“网络异常”。

4)引入新异常类。这使程序员能够根据异常类在代码中采取不同的操作。

 现在举一个需要使用自定义异常的例子,在一个抽象工厂中,可以将数据设置保存在SQLServer或SQLite中。业务层的代码片段如下:

            IUserDal dal = DataAccess.CreateUserDal();
            try
            {
                User user = dal.GetOneUser();
            }
            catch (SQLiteException ex)
            {
                //处理SQLite异常
            }
            catch (SqlException ex)
            {
                //处理SQLServer异常
            }

 

 这里虽然要捕获两个异常,但是显然,处理这两个异常的代码是一致的。另外,如果将来程序拓展成为数据存储在Oracle中,好需要为Oracle多设计一个Catch。所以在各自的数据层中,可以创建一个自定义异常DataAccessException,然后让它们各自捕获自己特定的异常,抛出一个共同的DataAccessException。

例如,在SQLite的数据层中:

        public User GetOneUser()
        {
            try
            {
                User user = null;
                //查询数据库得到user
                return user;
            }
            catch (SqlException)
            {
                throw new DataAccessException();
            }
        }

 

 SQLite的数据访问层也是一样。本文开头的业务层代码可以改为:

            IUserDal dal = DataAccess.CreateUserDal();
            try
            {
                User user = dal.GetOneUser();
            }
            catch (DataAccessException ex)
            {
                //处理数据连接异常
            }

 

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

以上是关于编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常的主要内容,如果未能解决你的问题,请参考以下文章

编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别

编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用

编写高质量代码改善C#程序的157个建议——建议52:及时释放资源

编写高质量代码改善C#程序的157个建议——建议41:实现标准的事件模型

编写高质量代码改善C#程序的157个建议——建议111:避免双向耦合

编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常