• .“.NET研究”Net中Exception你这样做了么? 狼人:


      这篇文章旨在与园友分享我对Exception的理解,如果存在不足的地方欢迎您指出。

      前不久写过一篇MVC的Exception的文章,这回重点讲解在实际开发中我对Exception 的认识。

      讲到Exception难免会涉及到经典的代码try..catch...finally..至于一些基本概念:这个代码块的执行方式、多catch的异常捕获顺序、exception的继承。这些不是本篇讨论的重点,但这不并代表基本概念不重要。

      建立Exception 时建议日常开发中需要注意以下几点:

      一、Throw new exception

      曾经看过有人在简单的函数内疯狂的使用throw new 参与业务逻辑。比如,以下代码:

    public object DoSomeThing(string userName)
    {
    try
    {
    if (String.IsNullOrEmpty(userName))
    {
    throw new Exception("用户名不能为空");
    }
    }
    catch (Exception ex)
    {
    return ex.Message;
    }
    return true;
    }

      逻辑类似以上代码,就是一个单一的函数,每当我看到这样的单一函数,总是觉得很奇怪。或许是自身水平有限,似乎难以理解为了catch住一个exception对象需要那么大费周章的去throw new 么?个人认为如果某方法内嵌套的方法根据业务逻辑主动抛出异常,让外层方法截获到这个异常,此时被嵌套的方法方可使用throw new ....

      二、抛出不该抛出的Exception

      上文中的DoSomeThing函数如果在catch时不进一步封装,直接把Excepiton抛到UI层,又或者直接显示给客户。如果异常堆栈中提示某些敏感数据。比如SQL查询语句、WebService URI或POST信息等。这些敏感信息应该永远不让客户知道,暴露出这些信息有可能对系统造成潜在安全隐患!

      三、更好的利用Exception

      在实际的开发中,既然抛出了Exception那么我们应该为Exception提供尽可能多的关于异常本身的有用信息。如何为抛出的异常提供更多的有用信息呢?请看以下代码:

    public static void ExecuteCommand(Action<IDbCommand> action, ref string errMsg)
    {
    using (var connection = new上海网站建设 SqlConnection("数据库连接字符串"))
    {
    var cmd
    = connection.CreateCommand();
    try
    {
    action(c上海企业网站设计与制作md);
    cmd.ExecuteNonQuery();
    }
    catch (DbException ex) //注意这里将DbException catch住
    {
    errMsg
    = ex.Message;
    var parameters
    = new Dictionary<string, object>();
    foreach (SqlParameter p in cmd.Parameters)
    parameters.Add(p.ParameterName, p.Value);

    //上海闵行企业网站制作span>尽可能获取与exception相关的有用信息,这里只是用SqlParameter举例而已。

    //TODO:(将 parameters 与 ex 对象保存或者进一步处理)

    }
    catch (Exception ex)
    {<上海徐汇企业网站设计与制作br />
    //TODO 其他的异常处理
    }
    finally
    {
    cmd.Dispose();
    }
    }
    }

      注释已经给的很清晰了,目的就是尽可能的提供与异常相关的有用信息,方便日后异常出现时便于调试。

      ExecuteCommand方法调用如下:

    static void Main(string[] args)
    {
    string errMsg = string.Empty;
    ExecuteCommand(cmd
    =>
    {
    cmd.CommandText
    = "UPDATE user SET name=@name WHERE id=@id";
    cmd.Parameters.Add(
    new SqlParameter("name", "字符串参数值"));
    cmd.Parameters.Add(
    上海徐汇企业网站制作"color: #0000ff;">new SqlParameter("id", 1));上海企业网站制作
    },
    ref errMsg);

    }

      类似以上机制,如果异常出现了,我认为可以大大减少debug的时间。

    声明:此博有部分内容为转载,版权归原作者所有~
  • 相关阅读:
    SQL SERVER 查询性能优化——分析事务与锁(一)
    SQL Server 查询性能优化——索引与SARG(三)
    SQL Server 查询性能优化——索引与SARG(二)
    SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
    SQL SERVER的锁机制(一)——概述(锁的种类与范围)
    SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
    关于AutoResetEvent的使用
    ASP.NET缓存
    Spring Framework 3.2.1 发布
    ExactImage 0.8.8 发布,C++ 图像处理库
  • 原文地址:https://www.cnblogs.com/waw/p/2217013.html
Copyright © 2020-2023  润新知