不做深入的研究,仅从表面认识一下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对发生的错误引发异常,使程序在检测到数据错误时立刻退出相应的方法,不至于继续深入到方法内部而产生性能损失并造成调试困难。

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

  1. 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置

    - 11.28 限定某个目录禁止解析php - 11.29 限制user_agent - 11.30/11.31 php相关配置 - 扩展 - apache开启压缩 http://ask.apelea ...

  2. magicui系统会不会升级鸿蒙,华为EMUI 11和Magic UI 4.0同步开启内测,均升级为鸿蒙系统...

    在昨天的华为开发者大会上,华为消费者业务软件部总裁王成录透露,EMUI 11和Magic UI 4.0同步开启内测. EMUI 11在今日正式开启Beta版本,支持华为P40.Mate 30.Mata ...

  3. Daily scrum[2013.11.28]

    2013.11.28 Qiang Li开始迁移代码,负责view和control层,但是win8机制和wp7机制还是有很大不同,遇到不少的问题. Yu Wu完成Data和Model层的代码迁移工作,这 ...

  4. 安装ORACLE 11.2.0.3 错误

    安装ORACLE 11.2.0.3 错误 检测时错误: Device Checks for ASM - This is a pre-check to verify if the specified d ...

  5. 训练日志 2018.11.28

    并查集.2-SAT.二分图相关内容都看完了,但只做了些并查集.二分图判定.二分图最大匹配的题,其他内容仍需多做些题来验证一下,只剩差分约束和网络流内容没看,考试周快来了,这周先尽量看吧.. 天冷了,这 ...

  6. 《中国人工智能学会通讯》——11.28 统一先验建模框架 II:整数规划

    11.28 统一先验建模框架 II:整数规划 在上一章中,利用约束谱聚类框架来求解视觉物体分割问题,其能很好地处理可以建模为一阶.二阶或高阶局部数据约束的先验信息.但有些先验知识,例如全局数据约束和模 ...

  7. scrum 11.28

    今天任务: 明天任务: 转载于:https://www.cnblogs.com/coding-hundredOfYears/archive/2012/11/28/2793860.html

  8. 2019.11.28

    2019.11.28 % 滑动平均(均值滤波) sliding_window = 5; impulse_fft_tmp = impulse_fft_6k; for i = 1+sliding_wind ...

  9. SeSe 2004年9月18日, 0:59:51

    SeSe 2004年9月18日, 0:59:51 我是你的影子,你不低头,你看不到我. 说: 在么 (≧?≦) 星空  {http://2089.vicp.net}  每时每刻每一件事,都要尽自己最大 ...

最新文章

  1. c语言程序设计多数求最大值,C语言编程问题存在三个整数,使x²+y²+z²=625,求x+y+z的最大值。这是大一C语言实验书的习题,请不要用过于复杂的算法语句...
  2. 一张截图,告诉你字节跳动的 Java 开发能力到底有多强...
  3. 【Android】 Android中spinner下拉列表的使用
  4. 3G-SDI光端机产品技术参数规格及产品应用领域
  5. java学习(24):if..else...if
  6. vscode 用户配置添加 分号、保存格式化、单引号、function格式
  7. python初学者经验总结_Python 初学者的经验总结
  8. SSH Tunnel扫盲(ssh port forwarding端口转发)
  9. 应用进展_解释的标准事件:第2部分–应用和进展
  10. TLSR8232-Telink蓝牙SoC之03程序下载和运行调试
  11. 抖音测试美甲软件,抖音最火的美甲
  12. Qt3升至Qt4需要注意的几件事项浅谈
  13. 实战技法 - 短线操盘 (8)
  14. 【DevExpress】 DevExpress.Xpf.Grid.InfiniteGridSizeException
  15. mysql 错误 #2054 解决方案
  16. 解决:IOS无法使用微软账号登录,显示“无法登录,请使用IMAP并重新登录“
  17. mac上如何找到隐藏文件夹/文件图片步骤(两种方法)
  18. 获取下拉框select上次选择的值
  19. HDU5040Instrusive
  20. 豆瓣引流能赚钱吗?怎么做?

热门文章

  1. 关于ArcGIS Mobile回传数据中常遇到的问题整理!
  2. python 求和并排序_Python堆排序原理与实现方法详解
  3. Android编程之ArrayList源码详解及使用
  4. 开发一款高端大气上档次的android应用需要必备的知识——记于2013年末
  5. 解决 Agent admitted failure to sign using the key 问题 with ssh
  6. Flash(as3.0) CScreen
  7. 4月23日云栖精选夜读:阿里AI新物种!设计机器人两年赶上资深员工水平
  8. 极品五笔管理员能用,普通用户无法使用
  9. 破产的圣文森特医院,如何利用大数据寻求解救方案?
  10. Discuz支持反对提示:抱歉您的请求来路不正确或表单无法提交的解决方法