一起谈.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的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值