标签:
几条建议:
如果无法处理某个异常,那就不要捕获它。
如果捕获了一个异常,请不要胡乱处理它。
尽量在靠近异常被抛出的地方捕获异常。
在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。
按照您的异常处理必须多精细来构造您的方法。
需要用几种类型的异常就用几种,尤其是对于应用程序异常。
把低层次的异常封装成层次较高程序员较容易理解的异常。
尽量输出造成异常的完整数据
尽量捕获具有特定含义的异常:比如SqlException,而不是简单地捕获一个Exception。
如果你的程序不是对效率苛求得过分,我建议你宁可多使用一些异常也是好的。
注意:我说的多使用的意思不是让你全部trycatch起来,然后catch(Exception e)把所有的异常都屏蔽了;而是暂时不考虑trycatch可能带来的效率上的损失,而注重程序的稳定性。
至于如何优化trycatch的使用,慢慢来。就我个人的使用而言,影响其实不是很大。
1. 不要滥用Try…Catch。一般来说只在最外层函数上才需要。因为该函数不能将Exception再往外抛了。所以需要Catch住做相应的处理,如显示Error Message。或转化为与调用模块约定好的Error Code。内部函数即使Catch住了Exception,也要往外抛,所以没有必要。
2. 为了使用Finally来保证资源的释放。如:
SqlConnection connection = null;
try
{
connection = new SqlConnection(ConnectionString);
connection.Open();
…
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (connection != null && connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
对这种情况Catch住的Exception直接往外抛,不做处理。需要注意的是这里使用Try…Catch不是唯一的办法,也可以使用using语句来保证资源的释放。
3. 为了保证函数有统一的出口。比如一个最外层的函数连续调用了一系列内部子函数,当其中某个子函数出错时, 跳到函数最后退出,对这种情况Catch住的Exception直接吃掉,因为在Try里面已经做了错误处理。如:
public Result OutMostFunction()
{
Result result = Result.Success;
try
{
try
{
SubFunction1();
}
catch (Exception ex)
{
result = Result.SubFunction_1_Error;
throw ex;
}
try
{
SubFunction2();
}
catch (Exception ex)
{
result = Result.SubFunction_2_Error;
throw ex;
}
try
{
SubFunction3();
}
catch (Exception ex)
{
result = Result.SubFunction_3_Error;
throw ex;
}
}
catch (Exception ex)
{
}
return result;
}
4. 为了区分程序错误与逻辑错误,需要自定义一个Exception类型。比如一个最外层函数调用一个密码验证子函数,就需要区分是因为密码错误(逻辑错误),还是在密码验证过程中程序出现了没有预料到的错误(程序错误)。如:
public class GoOutException : Exception {}
public Result OutMostFunction()
{
Result result = Result.Success;
try
{
try
{
if (!VerifyPassword(password))
{
result = Result.Invalid_Password;
throw new GoOutException();
}
}
catch (Exception ex)
{
if (!(ex is GoOutException))
{
result = Result.General_Error;
}
throw ex;
}
}
catch (Exception ex)
{
}
return result;
}
标签:
原文地址:http://www.cnblogs.com/huangfenggu/p/4503803.html