一起谈.NET技术,.Net中Exception你这样做了么?
2011-09-02 00:19
274 查看
这篇文章旨在与园友分享我对Exception的理解,如果存在不足的地方欢迎您指出。
前不久写过一篇MVC的Exception的文章,这回重点讲解在实际开发中我对Exception 的认识。
讲到Exception难免会涉及到经典的代码try..catch...finally..至于一些基本概念:这个代码块的执行方式、多catch的异常捕获顺序、exception的继承。这些不是本篇讨论的重点,但这不并代表基本概念不重要。
建立Exception 时建议日常开发中需要注意以下几点:
一、Throw new exception
曾经看过有人在简单的函数内疯狂的使用throw new 参与业务逻辑。比如,以下代码:
逻辑类似以上代码,就是一个单一的函数,每当我看到这样的单一函数,总是觉得很奇怪。或许是自身水平有限,似乎难以理解为了catch住一个exception对象需要那么大费周章的去throw new 么?个人认为如果某方法内嵌套的方法根据业务逻辑主动抛出异常,让外层方法截获到这个异常,此时被嵌套的方法方可使用throw new ....
二、抛出不该抛出的Exception
上文中的DoSomeThing函数如果在catch时不进一步封装,直接把Excepiton抛到UI层,又或者直接显示给客户。如果异常堆栈中提示某些敏感数据。比如SQL查询语句、WebService URI或POST信息等。这些敏感信息应该永远不让客户知道,暴露出这些信息有可能对系统造成潜在安全隐患!
三、更好的利用Exception
在实际的开发中,既然抛出了Exception那么我们应该为Exception提供尽可能多的关于异常本身的有用信息。如何为抛出的异常提供更多的有用信息呢?请看以下代码:
注释已经给的很清晰了,目的就是尽可能的提供与异常相关的有用信息,方便日后异常出现时便于调试。
ExecuteCommand方法调用如下:
类似以上机制,如果异常出现了,我认为可以大大减少debug的时间。
前不久写过一篇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的时间。
相关文章推荐
- 一起谈.NET技术,在MVC2.0 中 遭遇无法被 Try Catch 的 “Exception”
- 【转】一起谈.NET技术,关于c#静态方法和实例方法的辨析和应用
- 一起谈.NET技术,关于静态页和SEO的看法
- 一起谈.NET技术,构建高性能ASP.NET站点之三 细节决定成败
- 一起谈.NET技术,发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)
- 一起谈.NET技术,为什么我支持托管运行时(虚拟机)
- 一起谈.NET技术,跟ASP.NET MVC一起使用jQuery
- 一起谈.NET技术,ASP.NET缓存全解析6:数据库缓存依赖
- 一起谈.NET技术,负载均衡服务器Session共享的解决方案
- 一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)
- 一起谈.NET技术,WPF 基础到企业应用系列1——开篇有益
- 一起谈.NET技术,从WPF想开去
- 一起谈.NET技术,谈谈微软技术,以及对待技术应有的态度
- 一起谈.NET技术,大话Session
- 一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《在ASP.NET 4 Web Forms中实现URL导向》篇
- 一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法
- 一起谈.NET技术,SharePoint 2010 服务应用程序(Service Application)架构
- 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较
- 一起谈.NET技术,巨大转变!ASP.NET MVC2行为方法新改进
- 一起谈.NET技术,概括ADO.NET数据库连接的所有形式(基础)