
2010年9月26日
作为程序员,我想很多人应该都有过跟异常打交道的经历。而且相信也有很多人也都写过catch(Exceptione){//blabla}这种把所有未知异常一股脑儿捕获并处理掉的代码吧。不管是为敷衍客户也好,让程序继续运行以避免糟糕的用户体验也罢,在微软眼中,这种处理方式都是不对滴,特别是当你的程序是作为一个插件寄存在别的程序如VS,Offcie中时,这种情况下对有些严重的异常如访问冲突我们更应当是让程序结束而不是继续运行。然而很多时候,我们并不清楚哪些异常是严重的,哪些是可以让程序继续运行的,因为在.NET4.0以前,CLR会很忠实的把所有大大小小的异常一股脑儿的都抛给程序员处理。不过这个问题在4.0以后会得到很好的解决了。因为对有些严重的会引起进程崩溃的异常的处理以后会由CLR来统一处理而不再交给我们可怜的程序员了。下面我将对这种异样处理做一些简单的介绍。
为什么需要Corrupted State Exceptions
异常有大有小,小的如字符串为空,这些一般是用户输入问题,它不会引起整个程序或者系统中相关进程出现崩溃的情况;大的如访问冲突异常,这可能是你的程序在做一些可能会引起操作系统崩溃的事情,这种异常一般都比较严重,一般如果出现这种异常,通常程序应该做的是结束当前进程,然后老老实实向用户报告你犯傻了并提示他重启程序。不过在.NET4.0以前,CLR是很相信程序员不会搞出一些诸如catch(Exceptione){return;}这种不负责任的代码的,因此它不分轻重缓急,只要是异常,它统统都会抛出来,这里面不仅仅有托管代码的异常,也有一些.NET程序员不太好看懂的COM和WIN32异常。
CLR相信程序员在捕获异常的时候会只处理他们清楚的异常,但很多时候,作为开发人员,由于上面有老板,下面有客户,我们真的很难做人,想想如果老板动不动就听又客户抱怨他们只不过点了两下按钮程序就报错然后结束了,他还能给你加薪么?虽然很多时候我们清楚我们的代码不会出问题,但我们很难保证天时地利人和样样俱全,为了给老板和客户一个交代,这时候很多人都会选择去捕获所有的异常,然后记录下异常信息,然后程序继续彪悍的跑下去。
看似一些都很完美,客户不会再像以前那么频繁的抱怨程序down掉,老板也就高兴了。但有人不高兴。小的未知异常当然不会捅大的篓子,但对有些可能导致程序甚至操作系统崩溃的异常如果不中断程序的话可能影响的就是一大片了。这个时候客户可能不会抱怨你,但他会抱怨微软出了个烂操作系统,一天到晚蓝屏,或者他会抱怨微软的Office或者IE太烂,他只不过加载了一个插件,结果整个Outlook就报错崩掉了。你是省事了,但微软得来被黑锅,而且他还不知道这个黑锅里面到底是咋回事。
当然上面是玩笑,不过不管怎样,从程序安全和稳定的角度来看catch(Exceptione)确实不是一个好的编程习惯,然而木已成舟,既然无法避免程序员偷懒,微软只能采取一些补救措施了,这里他们在CLR4中添加了新的异常处理机制,自4.0以后,CLR不会主动给你抛出所有异常了,对于那些它认为是危险的,可能导致进程崩溃的异常它会标记为CorruptedStateException并自己处理掉而不是抛给程序员来做,如AccessViolationException这种继承自SystemException的异常就会被当做CorruptedStateException来处理。不过这里要注意的是,仅仅异常类型是可能会危险级别的异常还不够,CLR还会判断抛出异常的所有者,如果它发现是由操作系统抛出的访问冲突则会认为这是状态崩溃异常,但如果异常是由用户代码抛出,则CLR不会对其做特殊处理,它仍然会像以前一样将其正常抛出。
如何继续捕获Corrupted State Exceptions
那么CLR包了这块的异常处理是不是意味着以后我们程序员就没得选只能老老实实向用户报告我们的产品不行,然后让老板炒我们鱿鱼了呢?那些.NET4.0以前发布的,处处是漏洞的产品我们怎么处理?
虽然微软不再那么相信程序员是负责人的人,但它也做那么绝。虽然默认.NET4.0以后CLR会处理这些异常,程序员也不用再操心这些危险的异常了。但你仍然可以继续你以往敷衍上司的做法。并且微软还提供了两种方式。
1.如果你想把以往旧的代码在.NETFramework4.0下编译但又不想改代码的话,你可以在你的程序的配置文件中添加一个新的节点:legacyCorruptedState--ExceptionsPolicy=true,它使得你的代码仍能按照以前处理异常的方式来继续运行。
2.如果你不想有任何改变,直接把以前已经编译好的程序在.NETFramework4.0下运行则不需要任何改变,CLR会保证所有的异常仍然按照以往的方式处理。
其次,对于那些使用了.NETFramework4.0但又想自己处理这些导致程序状态崩溃的异常,微软同样提供了选择,他们在.NET4.0中增加了一个新的命名空间:System.Runtime.ExceptionServices,这里面有个特性类叫做HandleProcessCorruptedStateExceptionsAttribute,你只需要在相应方法上添加这个属性,CLR就会把所有的异常处理交给你做,就像以前一样。e.g.
!--
Code highlighting produced byActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/
--> view sourceprint?01 // This program runs aspartofanautomated test system so you need
// to prevent the normal UnhandledExceptionbehavior(Watsondialog).
// Instead, print out any exceptions and exitwithanerrorcode.
[HandledProcessCorruptedStateExceptions]
public static int Main()
{
try
{ // Catch any exceptions leaking out of the program
CallMainProgramLoop();
}
catch (Exception e) // We could be catching anything here
{ // The exception we caught could have been a program error
// or something much more serious. Regardless, we know that
// something is not right. Well just output the exception
// and exit with an error. We wont try to do any work when
// the program or process is in an unknown state!
System.Console.WriteLine(e.Message);
return 1;
}
return 0;
}
异常处理常常是程序员心中的一块心病,尽管微软认为自己得为纵容程序员滥用异常捕获负责然后添加了这个新的异常处理机制,不过在他们看来,那种catch(Exceptione)的行为仍然是不对的。他们认为异常的出现表明当前程序的状态出现了问题,而程序员应当清楚这些错误的状态所造成的后果,所以程序员应当捕获具体的异常并作出正确的处理,而不是因为偷懒或者省事去简单处理所有异常。
posted @ 2010-09-26 15:02 林间曦阳 阅读(37) 评论(0)
编辑

2010年8月31日
基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。
本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。
网站测试流程、要求及测试报告
一个网站基本完工后,需要通过下面三步测试才可以交活。
一、 制作者测试,包括美工测试页面、程序员测试功能。在做完后第一时间内由制作者本人进行测试。
a) 页面 包括首页、二级页面、三级页面的页面在各种常用分辨率下有无错位;图片上有没有错别字;各连接是否是死连接;各栏目图片与内容是否对应等。
b) 功能 达到客户要求;数据库连接正确;各个动态生成连接正确;传递参数格式、内容正确;试填测试内容没有报错;页面显示正确。
二、 全面测试 根据交工标准和客户要求,由专人进行全面测试。
也是包括页面和程序两方面,而且要结合起来测,保证填充足够的内容后不会导致页面变形。另外要检查是否有错别字,文字内容是否有常识错误。
三、 发布测试 网站发布到主服务器之后的测试,主要是防止环境不同导致的错误。
测试的主要方面:
一、功能测试
对于网站的测试而言,每一个独立的功能模块需要单独的测试用例的设计导出,主要依据为《需求规格说明书》及《详细设计说明书》,对于应用程序模块需要设计者提供基本路径测试法的测试用例。
1、链接测试:链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:
1)测试所有链接是否按指示的那样确实链接到了该链接的页面;
2)测试所链接的页面是否存在;
3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。
2、表单测试:当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。
B/S结构实现的功能可能主要的就在这里,提交数据,处理数据等如果有固定的操作流程可以考虑自动化测试工具的录制功能,编写可重复使用的脚本代码,可以在测试、回归测试时运行以便减轻测试人员工作量。
我们对UM子系统中各个功能模块中的各项功能进行逐一的测试,主要测试方法为:边界值测试、等价类测试,以及异常类测试。测试中要保证每种类型都有2个以上的典型数值的输入,以确保测试输入的全面性。
3、Cookies测试:Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies形式存储在客户端计算机上,可用来创建动态和自定义页面或存储登陆等信息。如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
4、设计语言测试:Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。
5、数据库测试:在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。
posted @ 2010-08-31 18:38 林间曦阳 阅读(29) 评论(0)
编辑

2010年7月16日
<?xml version="1.0" encoding="gb2312"?>
<users>
<user id="1">
<userName>outrace</userName>
<userPass>mypass</userPass>
</user>
<user id="2">
<userName>trace</userName>
<userPass>mypass</userPass>
</user>
则通过下面的代码进行写入操作
<% @ Import Namespace="System.IO" %>
<% @ Import Namespace="System.Xml" %>
<script Language="C#" Debug="true" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
String fileName;
fileName = "users_1.xml";
try
{
//先建立一个XML DOM
XmlDocument doc = new XmlDocument();
//读入XML文件
doc.Load(Server.MapPath("./files/")+fileName);
//建立一个节点。
XmlElement newUser = doc.CreateElement("user");
//建立一个属性,并将次属性放置在接点 “newUser” 下
XmlAttribute newID = doc.CreateAttribute("id");
newID.InnerText = "3";
newUser.SetAttributeNode(newID);
//建立一个节点,并将此做为“newUser”的子节点
XmlElement newUserName = doc.CreateElement("userName");
newUserName.InnerText = "新增用户名";
newUser.AppendChild(newUserName);
//建立一个节点,并将此做为“newUser”的子节点
XmlElement newUserPass = doc.CreateElement("userPass");
newUserPass.InnerText = "新增密码";
newUser.AppendChild(newUserPass);
//将节点“newUser”放在根节点下,并保存
doc.DocumentElement.AppendChild(newUser);
doc.Save(Server.MapPath("./files/")+fileName); //我的文件是放在同目录的file文件夹下的
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
finally
{
}
}
</script>
<html>
<head>
<title>插入一条数据</title>
</head>
<body>
<form runat="server">
<b>XML数据写入成功,文件的内容为:</b>
<p><asp:Xml id="myUser" DocumentSource="./files/users_1.xml" runat="server"/></p>
</form>
</body>
</html>
posted @ 2010-07-16 18:12 林间曦阳 阅读(40) 评论(0)
编辑

2010年6月14日
程序员:整天坐在电脑前,面对着一对程序编码,不管你喜不喜欢,你都要看着它,这就是你的工作。
陪酒女,整天坐在酒桌前,面对着一堆来消费的男人,不管你喜不喜欢,你都要陪着他,这也就是你的工作。
有一天你,当皱纹浮现上你的眼角,额头,或许这2个职业的从业者,都将失业,当然,不是全部,或许你挤破头,你做了程序项目经理或者“妈妈”。这都是少数,极少数,或者是偶然,但或者是你实在太出色。
为什么程序员会失业?因为他的大脑已经跟不上时代,他的专业领域中的专业知识已经被社会淘汰,或许他还整天在参加培训,参加考试,去学这个,学那个,但终有一天,当项目经理的位子已经有人稳坐,而你还只是一个普通的程序员,旁边新来的大学生把你归入叔叔级别的那天,或许,你就要失业了。
为什么陪酒女会失业?因为她的姿色已经吸引不了客人,她的面容已经不在让客人掏钱买酒,或许她还整天的去美容院,整容院,去磨皮去拉皮,或者去丰一下去瘦一下,但终有一天,当新来的女孩儿把你归入阿姨级别的那天,或许,等待她的也是失业。
我并不想去贬低一个职业,也绝非看不起陪酒女,所有职业在不违法的前提下,都是高贵的,哪怕你是出卖色相,或许你走在路上同时遇到你的2个同学,一个是程序员一个是陪酒女,你会发现,他们一样的苍老,一样的憔悴,一样的被生活,被工作压迫的气喘吁吁。
曾经热门到所有学科都要仰视的计算机软件,到现在满大街搞程序的人,真不知道是何去何从……
posted @ 2010-06-14 08:14 林间曦阳 阅读(13) 评论(0)
编辑

2010年4月29日
摘要: 口水战越来越多,本来是习惯性的看几篇好文...结果沾了一身口水...
阅读全文
posted @ 2010-04-29 16:13 林间曦阳 阅读(11) 评论(0)
编辑

2010年2月3日
摘要: 中国软件企业排名 1 华为技术有限公司 622360 2 中兴通讯股份有限公司 601331 3 海信集团有限公司 448641 4 UT斯达康通讯有限公司 386763 5 海尔集团公司 333664 6 神州数码(中国)有限公司 311862 7 浙江浙大网新科技股份有限公司 288781 8 熊猫电子集团有限公司 233572 9 浪潮集团有限公司 181046 10 东软集团有限公司 17...
阅读全文
posted @ 2010-02-03 23:19 林间曦阳 阅读(823) 评论(0)
编辑

2010年2月1日
摘要: --> .Net微软.Net中文主页.NET Framework开发中心微软.Net Framework中文产品支持中心微软.Net Framework中文新闻组(Web)微软VB.Net中文新闻组(Web)博客园 .NET 2.0 专题孟宪会之精彩世界微软.NET俱乐部MSDN中文网络广播AspxBoy教程网天极网微软开发专栏中国IT实验室DOTNET频道阿良.Net主页中国IT实验室.Net电...
阅读全文
posted @ 2010-02-01 15:32 林间曦阳 阅读(40) 评论(0)
编辑

2010年1月19日
摘要: 这两天听说了一个很不错的基于.NET平台的Web自动化测试框架WatiN,下载试用了一下,的确很好用。它的基本功能和Selenium有点像,但是不如Selenium强大,没有脚本录制,只支持IE6/7等。它基本功能包括自动操作大部分的HTML元素,多种查找方式,支持AJAX,支持frame/iframe,支持弹出框等等。现在用一个简单的例子来看看怎样使用WatiN来进行TDD。 在这个例子中...
阅读全文
posted @ 2010-01-19 08:58 林间曦阳 阅读(55) 评论(0)
编辑

2009年12月29日
摘要: 一、为什么要创建索引呢(优点)?创建索引可以大大提高系统的性能。第一, 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二, 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三, 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四, 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五, 通过使用索引,可以在查询的过程中,...
阅读全文
posted @ 2009-12-29 08:40 林间曦阳 阅读(46) 评论(0)
编辑