2004-11-28+ 认识Duwamish 7.0(3)错误处理

不做深入的研究,仅从表面认识一下duwamish中的错误处理。
错误处理主要是通过systemframework的applicationassert和applicationlog完成。其中assert主要是给编程人员提供帮助,而log则用于日志记录。用户看到什么?用户将不会看到任何具体的错误信息,只是一个抱歉的页面。
注意,由于duwamish的设定太多,我还没有搞清到底有几个记录事件错误的东东,为了方便,暂且全部称为日志!

1.客户端错误提示
首先,web.config的customErrors节指定了发生错误时要显示的页面,这就确保了不会通过错误信息向用户透漏任何系统信息,这也是安全措施之一。
你可以故意输入一个不存在的图书类别号来查看该错误处理页面。比如这样:
http://localhost/Duwamish7/categories.aspx?id=4
另外,当异常发生后,在pagebase被截获,然后它调用ApplicationLog.WriteError将错误写入日志中。

2.错误数据处理
前面数据访问一文中说过,因为使用了dataset来做数据的传递和操作,所以可以使用dataset的丰富功能来方便很多操作。在错误处理这方面,如果中间业务层检测到某行的数据有错误,就会使用RowError属性或SetColumnError方法来把错误加进入,然后不做任何处理并返回到表示层,然后进行相应的处理。这个环节的一个例子是当注册新用户时使用了相同的email,businessrules的Insert方法就会使用如下代码来处理该错误
row.SetColumnError(CustomerData.EMAIL_FIELD, CustomerData.EMAIL_FIELD_NOT_UNIQUE);
row.RowError = CustomerData.INVALID_FIELDS;
result = false;

最后传到表示层,accoutmodule的DisplayErrors方法负责最后处理。
String fieldError = customerRow.GetColumnError(CustomerData.EMAIL_FIELD);
if (0 == String.Compare(fieldError, CustomerData.EMAIL_FIELD_NOT_UNIQUE, true, CultureInfo.InvariantCulture))
EmailUniqueCustomValidator.IsValid = false;


3.程序调试和错误记录
当应用程序发生错误,找到问题所在通常是一件痛苦的事,但duwamish的设计者在这点上估计会轻松很多,因为有专门的applicationassert来帮助程序员。applicationassert包括两个主要的方法:check和checkcondition。check可以向通常情况的日志写入警告,而checkcondition则会抛出异常。两者的共同点就是使用System.Diagnostics.Debug.Fail帮助程序员调试时及时发现问题,并且可以将信息写入系统日志,方便以后查看。下面分别介绍:

check的示例:account.aspx.cs
protected void Page_Load(Object sender, EventArgs e)
{
// Ensure that the customer data is still in the session.
ApplicationAssert.Check(Customer != null, "No Customer at Account Edit", ApplicationAssert.LineNumber);
if (null == Customer)
{
ShoppingCart().Customer = null;
FormsAuthentication.SignOut();
Response.Redirect("account.aspx", false);
}
}

check主要用在表示层,用来记录在用户使用过程中发生的一些错误,比如上面这个页面在加载的时候要保证customer不为空,否则就要重定向到登陆页面(这里是先清除cookie,然后试图转到这个受保护的account.aspx,当然不可以,所以用户就被定向到登陆页面,待重登陆后再转回来。)customer不存在可能是因为用户离开太久,也可能是用户没有登陆就要访问这个页面,总之这不是一个严重的错误,但是需要把这个记录到通常情况的日志中。
查看所有使用check方法的地方,都是使用check后接着对其中的false情况进行处理。

checkcondition的示例:BusinessRules.Customer.GetCustomerByEmail
ApplicationAssert.CheckCondition(emailAddress != null && emailAddress != String.Empty,"emailAddress Parameter cannot be null or empty",ApplicationAssert.LineNumber);
email为空当然是错误,程序没有必要再进行下去了,所以在这里使用CheckCondition来检查这种情况。一旦发生,就停止执行下面的语句,抛出异常。
checkcondation被广泛的用在业务中间层的各种方法的开始部分,这样做的好处可以迅速的发现异常情况并进行处理。一般在进行调试过程中,诸如某字段不存在或数组数据某个值出错这类错误很难查找,一般是到了使用该数据的时候才会发生异常,这时要找出异常真正的根源就变的很困难。但在这里提前对可能发生的错误进行判断,程序员在调试的时候就会得到vs的断言失败的警告,避免了“异常发生在不应该发生的地方”这种情况的出现。

4.try-catch-finally语句的时候
在assert和log中的核心方法中存在这中结构,其作用是为了在异常发生时进行清理工作。

下面是msdn上对duwamish中错误处理若干方法的列举,我加了一些自己的解释,因为不知对错,所以就在笔记的最后了:)
1.返回代码
在最基本的级别上 Duwamish 7.0 使用返回代码报告状态情况。
是指使用断言失败后得到警告的方法来获得产生错误的代码,这个主要是用在程序调试时使用。
2.先决条件
Duwamish 7.0 在公共方法中测试先决条件。
在程序进行过程中,先对一些敏感数据使用ApplicationAssert.Check进行预判断,如产生错误,则及时的记录到日志中。
3.后置条件
Duwamish 7.0 检查从函数的退出是否适当。Duwamish7.ApplicationAssert.CheckCondition 方法生成调用堆栈、记录错误信息并引发应用程序异常。

通过ApplicationAssert.CheckCondition对发生的错误引发异常,使程序在检测到数据错误时立刻退出相应的方法,不至于继续深入到方法内部而产生性能损失并造成调试困难。

你可能感兴趣的:(sh)