介绍
在任何应用系统开发中异常管理对开发人员来说都是一个关键领域作为一个开发人员你应该采用一种合适的能让你编写健壮且高质量代码的异常管理策略如果使用得当异常管理将是一个很强大的概念而且使你的开发工作变的很容易然而一个不合适的异常处理将会使你的应用系统性能降低
在你钻研这些之前要先搞清楚异常管理是什么这点很重要一般来说异常就表示打破系统预定的假设异常和错误是不一样的为了解释清楚我们来看两个例子
示例一
我们假设你试图向一个文件写入数据而你的应用程序也认为这个文件在正确的路径上如果不在就会抛出一个异常而话说回来如果你的职责是跟蹤此文件那么代码里还有(找不到文件的)异常那将是一个不好的编码习惯这种情况应该被校验代码处理(而不是异常)
示例二
再让我们假设一个一般的ASPNET程序中你正试图更新数据库中所有必需的字段你的应用程序认为此数据库连接可用假设实际上这个连接是不可用的……抛出异常是一个解决方案而我们又把话说回来如果更新数据库的必填字段时出现有几个值为空的字段那抛出异常就没有必要了这些处理应该由校验代码完成
如何处理异常
作为一个开发人员你应该感受到通过try catch finally块来构建一个结构化异常处理机制的优点NET框架提供了一大堆异常处理层次来处理不同种类的异常所有的异常都继承自Exception(基类)你可以通过继承来实现自定义错误处理以扩展异常处理机制不幸的是很多开发人员都误用了这种架构能力一个随时要记着的事是当一个异常发生在运行时时(这个架构)应该如何运作?一般有以下三种情况
忽略异常让它在调用栈里上升而被其它的catch块捕获
捕获异常同时为你的应用程序执行必要的动作如果你不想再次在异常中抛出异常的话
捕获异常并用其它异常覆盖它这样和你的应用程序有更密切的关系异常覆盖是为了避免打破(架构中的)抽象层次你可以通过你抛出的异常的InnerException属性指定原异常是什么这样就可以把你现有的异常用一个新的异常来覆盖了(更与你系统有关的)为了了解异常覆盖让我们来看一个能引起IOException异常的方法你可以在应用级别使用LoadingException 或 FailtoLoadInfoException来覆盖原有的IOException异常这样比把底层的IOException给用户看到要来的好些
一个应用程序的异常处理框架应该有以下几种(要求)
探测异常
执行代码清除
内部异常覆盖
内部异常替换
记录并报告错误信息
建立能被外部监视的事件以帮助系统操作
在开始你应该建立一个一致的健壮的异常管理架构在你所有的系统中应该很好的封装并抽象其记录和报告等的细节
好的习惯
以下列出一些不错的提示/建议供你在(设计)异常处理(时)参考
抛出异常要不小的代价所以你应该尽可能地在异常情况下进行异常处理不要去控制正规逻辑流程比如以下代码
void EmpExits(string EmpId)
{
// search for employee
if(drRead(EmpId) == ) // no record found
{
throw(new Exception(Emp Not found));
}
}
应该用以下代码
bool EmpExits(string EmpId)
{
// search for employee
if(drRead(EmpId) == ) // no record found
{
return false;
}
}
避免在循环中捕获异常如果实在是要捕获那把整个循环都放在try/catch块里
采用标准try/catch/finally异常处理方式进行处理这在托管代码里是被推荐的最后的Finally块确保异常事件中的资源都被释放掉了
比如
SqlConnection conn = new SqlConnection(
);
try
{
connOpen();
// some operation
// some additional operations
}
catch(Exception ex)
{
// handle the exception
}
finally
{
if (conn != null && connState == ConnectionStateOpen)
connClose(); // closing the connection
}
[] []