zoukankan      html  css  js  c++  java
  • 一起谈.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(cmd);
    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);

    //尽可能获取与exception相关的有用信息,这里只是用SqlParameter举例而已。

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

    }
    catch (Exception ex)
    {
    //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(
    new SqlParameter("id", 1));
    },
    ref errMsg);

    }

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

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/waw/p/2163100.html
Copyright © 2011-2022 走看看