几条建议:
若是没法处理某个异常,那就不要捕获它。
若是捕获了一个异常,请不要胡乱处理它。
尽可能在靠近异常被抛出的地方捕获异常。
在捕获异常的地方将它记录到日志中,除非您打算将它从新抛出。
按照您的异常处理必须多精细来构造您的方法。
须要用几种类型的异常就用几种,尤为是对于应用程序异常。
把低层次的异常封装成层次较高程序员较容易理解的异常。
尽可能输出形成异常的完整数据
尽可能捕获具备特定含义的异常:好比SqlException,而不是简单地捕获一个Exception。php
若是你的程序不是对效率苛求得过度,我建议你宁肯多使用一些异常也是好的。
注意:我说的多使用的意思不是让你所有trycatch起来,而后catch(Exception e)把全部的异常都屏蔽了;而是暂时不考虑trycatch可能带来的效率上的损失,而注重程序的稳定性。
至于如何优化trycatch的使用,慢慢来。就我我的的使用而言,影响其实不是很大。程序员
1. 不要滥用Try…Catch。通常来讲只在最外层函数上才须要。由于该函数不能将Exception再往外抛了。因此须要Catch住作相应的处理,如显示Error Message。或转化为与调用模块约定好的Error Code。内部函数即便Catch住了Exception,也要往外抛,因此没有必要。api
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;
}