您的位置:首页 > 编程语言 > ASP

我的Asp.net站点的异常处理机制

2007-07-06 14:40 381 查看
这两天在对以前的系统进行重构。以前是在数据层发现sql异常后,就地进行处理,跳转到出错页面。这样处理的问题是数据层的代码只能被用户请求的页面所涉及到的功能进行调用;而整个系统中中还包括一个windows服务项目,即使在网站项目内部也包括了一个后台工作线程来异步处理一些复杂请求,它们也需要使用数据层。接下来,给出自己在异常处理这个部分的重构步骤:

1.建立一个自己的异常类。有一点是我比较困惑的,如果我通过SqlCommand来执行一个查询或者更新,由于种种原因操作没有成功,抛出一个SqlException,那么在SqlException里面应当有一个属性来打印查询或更新的sql命令文本。就我个人而言,我觉得这是对开发者最有帮助的信息。虽说异常里提供了调用栈,可以帮我定位到出错的数据层、逻辑层或显示层方法,但查看这些方法的源代码、找出里面执行数据库操作的相关语句效率还是太低了。可我找了半天也没找到,如果哪位同志清楚的话能不能跟我说一下?如果确实没有这个属性,请问又是为什么呢?我自己的异常类非常简单,除了一个SqlException类型的对象,就是一个表示sql命令的文本,代码如下:

1public class SqlTextException : Exception
2public Object ExecuteScalar(string cmdText, SqlParameter[] sqlParams)
2void Application_Error(object sender, EventArgs e)
2{
3 Exception objErr = Server.GetLastError().GetBaseException();
4 GEA52.Rule.SqlBase.SqlTextException myExp = objErr as GEA52.Rule.SqlBase.SqlTextException;
5 if (myExp != null)
6 {
7 string err = "引发错误的sql语句为:\n" + myExp.SqlText +"\n; 系统返回的出错信息:"+myExp.BaseException.Message;
8 Server.ClearError();
9 GEA52.Rule.CommonRule.ShowError(err);
10 }
11 else
12 {
13 string err = "在Application_Error事件中捕获异常:\n" +
14 "Error in:" + Request.Url.ToString() +
15 "\nError Message:" + objErr.Message.ToString() +
16 "\nStack Trace1:" + objErr.StackTrace.ToString();
17
18 Server.ClearError();
19 GEA52.Rule.CommonRule.ShowError(err);
20 }
21}
非Web环境可就没那么幸运了,我还没能找到一个统一的未处理异常处理位置(哪位兄弟知道,望不吝赐教^_^)。好在这部分代码不多,我在一些主要的方法调用处进行了异常捕获,并把捕获后的异常存储数据库(在数据库里建了ErrorLog表,表包含Message,Source,TargetSite,StackTrace等列来记录异常的一些主要属性),这一部分就不赘述了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: