zoukankan      html  css  js  c++  java
  • 编写高质量代码改善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个建议》陆敏技

  • 相关阅读:
    组合数计算
    使用叉积判断两条直线是否相交
    关于括号的简单模拟题
    链表
    长句拆单词
    第九章 SpringCloud之Zuul路由
    第八章 SpringCloud之Feign、Hystrix结合使用
    第七章 SpringCloud之非声明式RestClient:Feign
    第六章 SpringCloud之Ribbon负载均衡
    第五章 SpringCloud之Eureka-Client使用RestTemplate实现服务之间的调用
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4738218.html
Copyright © 2011-2022 走看看