以文本方式查看主题 - 华夏网·艺术论坛 (http://bbs.cnrr.cn/index.asp) -- 源码天地 (http://bbs.cnrr.cn/list.asp?boardid=211) ---- 异常管理 (http://bbs.cnrr.cn/dispbbs.asp?boardid=211&id=24637) |
-- 作者:云中漫步 -- 发布时间:2007/4/1 12:15:42 -- 异常管理 [原文: Best Practices: Exception Management] [出处: http://www.dotnetjunkies.com/] [作者: Anand Kumar] [翻译:极地银狐.NET]
介绍在任何应用系统开发中,异常管理对开发人员来说都是一个关键领域。作为一个开发人员,你应该采用一种合适的、能让你编写健壮且高质量代码的异常管理策略。如果使用得当,异常管理将是一个很强大的概念而且使你的开发工作变的很容易。然而,一个不合适的异常处理将会使你的应用系统性能降低。
在你钻研这些之前,要先搞清楚异常管理是什么,这点很重要。一般来说异常就表示“打破系统预定的假设”。“异常”和“错误”是不一样的,为了解释清楚,我们来看两个例子: 示例一我们假设你试图向一个文件写入数据,而你的应用程序也认为这个文件在正确的路径上。如果不在,就会抛出一个异常。而话说回来,如果你的职责是跟踪此文件,那么代码里还有(找不到文件的)异常那将是一个不好的编码习惯,这种情况应该被校验代码处理(而不是异常)。 示例二再让我们假设一个一般的ASP.NET程序中,你正试图更新数据库中所有必需的字段。你的应用程序认为此数据库连接可用,假设实际上这个连接是不可用的……抛出异常是一个解决方案。而我们又把话说回来,如果更新数据库的必填字段时出现有几个值为空的字段,那抛出异常就没有必要了,这些处理应该由校验代码完成。 如何处理异常作为一个开发人员,你应该感受到通过try, catch, finally块来构建一个结构化异常处理机制的优点。.NET框架提供了一大堆异常处理层次来处理不同种类的异常。所有的异常都继承自Exception(基类)。你可以通过继承来实现自定义错误处理以扩展异常处理机制。不幸的是,很多开发人员都误用了这种架构能力。一个随时要记着的事是当一个异常发生在运行时时(这个架构)应该如何运作?一般有以下三种情况:
一个应用程序的异常处理框架应该有以下几种(要求):
在开始你应该建立一个一致的,健壮的异常管理架构,在你所有的系统中应该很好的封装并抽象其记录和报告等的细节。 好的习惯以下列出一些不错的提示/建议供你在(设计)异常处理(时)参考:
void EmpExits(string EmpId) { // search for employee if(dr.Read(EmpId) == 0) // no record found { throw(new Exception("Emp Not found")); } } 应该用以下代码: bool EmpExits(string EmpId) { // search for employee if(dr.Read(EmpId) == 0) // no record found { return false; } }
SqlConnection conn = new SqlConnection(""); try { conn.Open(); // some operation // some additional operations } catch (Exception ex) { // handle the exception } finally { if (conn != null && conn.State == ConnectionState.Open) conn.Close(); // closing the connection }
double result = 0; try { result = firstVal/secondVal; } catch(System.Exception e) { // handling the zero divided exception } 应该替换成: double result = 0; if(secondVal != null && secondVal > 0) { result = firstVal/secondVal; } else { result = System.Double.NaN; }
try { // Perform some operations ,in case of throw an exception… } catch (Exception e) { // Try to handle the exception with e throw; }
try { } catch(SqlException sqlexp) // specific exception handler { } catch(Exception ex) // Generic exception handler { }
|