|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专业性的服务。有的ASP商提供垂直型的应用服务,针对某一特定行业提供应用服务。debug有人说web程序员不算是真实的程序员,刚听到这句话的时分很愤恚,但细心想一想,这话仍是很有事理的。能够说,年夜部分的web程序员不克不及算是真实的程序员,由于他们的年夜部分注重力在完成功效上,而对一些程序员必需要把握的器材涓滴不在乎。能够这么说,还不会爬就想跑了。
大概你不会批准下面的话,但问一下本人,除改改例籽实现功效之外,你对一些基础的器材有几懂得?先不说那些庞大的诸如面向工具一类的器材,我们就说说复杂的排错、纠错吧,你做了几?
想一想看,作为程序员生怕天天年夜多半的工夫是在debug,但事实有几人真正把握公道的、迷信的往debug呢?之前的web编程言语象asp/php/cgi等关于debug的功效很弱,但如今的c#及java供应了丰厚的debug手腕,但你用了几呢?你大概对System.Data.SqlClient的每一个类、每一个办法、每一个属性都洞若观火,但你对System.Diagnostics懂得几呢?
古代的编程言语如c++,java,c#等都非常器重对毛病的避免、处置,在这儿我就讲一下在c#里的排错、纠错,但愿人人能从中学到一些有效的器材,但愿今后不会再听到文章开首那句话。
debug最幻想的形态是甚么?这个不必我说,那就是defectfree,没有bug,呵呵。但早有人说了,没有bug那还叫程序吗?win2000还60000多个bug呢。以是我们要做到的是只管避免bug,bug呈现后能敏捷定位成绩地点,修改这个bug。.net供应了很丰厚的debug手腕,除一些debug相干的nampespace,c#言语自己也有相干的内容存在。经常使用的有前提编译、try/catch、trace和断言(Assert)等,假如你能纯熟把握这些手腕,综合使用,那末debug将不再是一场噩梦,也不会像如今如许呈现一点儿成绩就满论坛追着人问:“我这儿又堕落了,为何呀?”。上面我将分离讲一下这些手腕的使用。
1、捕获非常(try/catch/finally)
这个我不必说,人人都分明它的感化,就是捕获程序中一切大概招致毛病的非常,然后到场本人的处置措施,而且使程序持续运转,而假如不捕获非常的话,程序将会停止,复杂的把毛病信息发送给客户。
以是,在举行一切大概呈现毛病的操纵时都应当捕获非常,象上面这个例子,捕获数据库操纵大概呈现的非常。
///<summary>
///获得数据库毗连
///</summary>
///<paramname="a_strDatabase">数据库名</param>
///<paramname="oa_objConnection">输入参数,空数据库毗连</param>
publicvoidGetConnection(stringa_strDatabase,outSqlConnectionoa_objConnection)
{
oa_objConnection=null;
stringstrConnStr="";
try
{
strConnStr="server="+m_objIni.GetProperty("server")+";uid="
+m_objIni.GetProperty("uid")+";pwd="+m_objIni.GetProperty("password")
+";database="+a_strDatabase;
oa_objConnection=newSqlConnection(strConnStr);
oa_objConnection.Open();
//logit
m_objLog.Write("数据库毗连ok");
}
catch(SqlExceptione)
{
//logit
m_objLog.Write("数据库毗连堕落",e);
#ifDEBUG
Console.WriteLine(e.ToString());
#endif//DEBUG
throw(e);
}
}
}//endclass
2、前提编译
java不供应前提编译,这是我以为java欠好的一个缘故原由之一,以是在写java时都是本人写一个类来完成前提编译。那末,甚么是前提编译呢?就是当切合某一前提时编译,不切合时就不编译,这就便利了debug。我们常常碰到这类情形,在某一历程或办法里我们想要晓得某个变量的值,对照经常使用的办法是在页面或把持台输入这个变量的值,已断定是不是是本人但愿的值,但假如没有前提编译的话,但当你公布刊行版本时必要手工删失落这些输入语句,费时、吃力,而且简单堕落,而假如有前提编译,那就便利多了。看上面这个例子:
///<summary>
///初始化
///</summary>
privatevoidInitialize()
{
try
{
m_objConnManager=newConnManager(m_strIniFilePath,"./config/newsdata.ini");
log=newLog("./logs/newserver.log");
}
catch(Exceptione)
{
#ifDEBUG
Console.WriteLine("初始化"+e.Message);
#endif//DEBUG
throw(newException("初始化"+e.Message));
}
}
注重到个中的#ifDEBUG那几句吗?它的感化就是当DEBUG时,在把持台输入非常信息,以便你即刻晓得呈现甚么毛病,而当不是DEBUG时,那句就不会被编译。
3、断言(Assert)
断言真是一个值得年夜书特书的好器材,但惋惜的是80%的程序员特别是web程序员不必它,乃至基本就没传闻过。很难给断言下一个界说,假如要具体说它的优点,几乎都能够写一本书了。复杂地说,断言就是在应当是准确的中央加一个判别已断定它真的准确(这话有些拗口,上面我会具体注释),它的感化就是确保你的程序依照估计的方针一般运转,而且可以匡助你敏捷定位毛病缘故原由。断言的机制很复杂,就象c#里的断言办法System.Diagnostics.Debug.Assert的界说,判别一个前提是不是建立,假如不建立的话就显现一条信息。看起来很复杂,真的能起那末高文用吗?让我们看下边这个例子。
///<summary>
///存取m_strID的属性
///</summary>
publicstringID
{
get
{
returnthis.m_strID;
}
set
{
#ifDEBUG
//断言
Debug.Assert(value.Length%2==0,"分类id长度必需为偶数");
#endif
this.m_strID=value;
}
}//endmethod
这是个很复杂的办法,就是为了存取m_strID这个成员变量的值,这个m_strID是个使用编码划定规矩完成树形布局的字符串成员变量,就像如许:010213,两位为一距离,经由过程它的长度和编码划定规矩能够很简单失掉它位于第几层,它的父节点的id等等。由于两位数为一距离,以是这个字符串的长度必需是个偶数。
看到Debug.Assert那句吗?它的感化就是判别这个字符串的长度是否是偶数,假如不是,则谈出一个对话框来显现"分类id长度必需为偶数"。也许你会说看不出它有甚么感化,不就是判别一个值符不切合请求吗。原本这个程序都是你本人写的,以是你给这个m_strID赋值时应当晓得这个长度为偶数的限定,一样平常情形下应当都是准确的,好,如今让我们假定这么一种情形,因为某种缘故原由,你健忘了这个限定,而把一个长度是奇数的字符串赋给这个变量,而这时候固然有成绩但程序其实不报错,持续运转,当过了很远时,这个毛病显现出来,使全部程序溃散或终极了局不准确,这时候即便程序报错也是在离发生这个毛病的真正缘故原由很远的中央,大概爽性就不报错,这是你要找到毛病的缘故原由就很坚苦了,大概要消费几小时乃至几天的工夫,而假如事先你加了断言,运转到这里的时分就会停止,告知你毛病的缘故原由,也就制止了前面呈现的成绩和你为改正这个成绩所支付的工夫和精神。
怎样,如今是否是对断言有了必定的懂得,而且有一些乐趣呢?试一下吧,渐渐的你会感觉到它的能力。别的必要说的一点是断言是为了帮助deubg的,而不是举行毛病处置的,以是一样平常把它和前提编译分离利用,只要当编程、测试时才利用断言,而当刊行恰是版本时应当往失落断言,由于究竟它是要影响效力的。
4、日记(log)
程序记不记日记生怕是辨别传统程序员和web程序员最好的标记了。年夜多半使用程序都记日记,而几近一切的web程序都不记日记,呵呵。实在日记也是一个出格有效的器材,假如不纪录日记,那极可能体系产生了甚么、呈现甚么情形你都不分明,特别是工夫一长,更简单呈现这类情形。以是,养成优秀的习气,让你的程序写log吧。
固然,除上述这些,另有良多器材,如跟踪(trace)单步伐试等等,你能够本人看一下材料。
办法我都讲了,用不必就是你的成绩了,呵呵。
</p>ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于WindowsNT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失; |
|