如何更好更快的debug

儒雅的荔枝

儒雅的荔枝

2016-01-29 18:32

如何更好更快的debug,如何更好更快的debug
  有人说web程序员不算是真正的程序员,刚听到这句话的时候很气愤,但仔细想想,这话还是很有道理的。可以说,大部分的web程序员不能算是真正的程序员,因为他们的大部分注意力在实现功能上,而对一些程序员必须要掌握的东西丝毫不在意。可以这么说,还不会爬就想跑了。
可能你不会同意上面的话,但问一下自己,除了改改例子实现功能以外,你对一些基本的东西有多少了解?先不说那些复杂的诸如面向对象一类的东西,我们就说说简单的排错、纠错吧,你做了多少?
想想看,作为程序员恐怕每天大多数的时间是在debug,但究竟有多少人真正掌握合理的、科学的去debug呢?以前的web编程语言象asp/php/cgi等关于debug的功能很弱,但现在的c#及java提供了丰富的debug手段,但你用了多少呢?你可能对System.Data.SqlClient的每个类、每个方法、每个属性都了如指掌,但你对System.Diagnostics了解多少呢?
现代的编程语言如c++ , java , c#等都十分重视对错误的防止、处理,在这儿我就讲一下在c#里的排错、纠错,希望大家能从中学到一些有用的东西,希望以后不会再听到文章开头那句话。
debug最理想的状态是什么?这个不用我说,那就是defect free,没有bug,呵呵。但早有人说了,没有bug那还叫程序吗?win2000还60000多个bug呢。所以我们要做到的是尽量防止bug,bug出现后能迅速定位问题所在,修正这个bug。.net提供了很丰富的debug手段,除了一些debug相关的nampespace,c#语言本身也有相关的内容存在。常用的有条件编译、try/catch、trace以及断言(Assert)等,如果你能熟练掌握这些手段,综合运用,那么debug将不再是一场恶梦,也不会像现在这样出现一点儿问题就满论坛追着人问:“我这儿又出错了,为什么呀?”。下面我将分别讲一下这些手段的运用。

一、捕捉异常(try / catch /finally)
这个我不用说,大家都清楚它的作用,就是捕捉程序中所有可能导致错误的异常,然后加入自己的处理措施,并且使程序继续运行,而如果不捕捉异常的话,程序将会终止,简单的把错误信息发送给客户。
所以,在进行所有可能出现错误的操作时都应该捕捉异常,象下面这个例子,捕捉数据库操作可能出现的异常。

/// <summary
/// 取得数据库连接
/// </summary
/// <param name="a_strDatabase"数据库名</param
/// <param name="oa_objConnection"输出参数,空数据库连接</param
public void GetConnection(string a_strDatabase , out SqlConnection oa_objConnection)
{
oa_objConnection = null ;
string strConnStr = "";
try
{
strConnStr = "server=" + m_objIni.GetProperty("server") + ";uid="
+ m_objIni.GetProperty("uid") + ";pwd=" + m_objIni.GetProperty("password")
+ ";database=" + a_strDatabase ;
oa_objConnection = new SqlConnection(strConnStr) ;

oa_objConnection.Open() ;

//log it
m_objLog.Write("数据库连接ok") ;
}
catch(SqlException e)
{
//log it
m_objLog.Write("数据库连接出错" , e) ;

#if DEBUG
Console.WriteLine(e.ToString()) ;
#endif//DEBUG
throw(e) ;
}
}

}//end class

二、条件编译
java不提供条件编译,这是我觉得java不好的一个原因之一,所以在写java时都是自己写一个类来实现条件编译。那么,什么是条件编译呢?就是当符合某一条件时编译,不符合时就不编译,这就方便了debug。我们经常遇到这种情况,在某一过程或方法里我们想要知道某个变量的值,比较常用的方法是在页面或控制台输出这个变量的值,已确定是否是自己希望的值,但如果没有条件编译的话,但当你发布发行版本时需要手工删掉这些输出语句,费时、费力,并且容易出错,而如果有条件编译,那就方便多了。看下面这个例子:
/// <summary
/// 初始化
/// </summary
private void Initialize()
{
try
{
m_objConnManager = new ConnManager(m_strIniFilePath , "./config/newsdata.ini") ;
log = new Log("./logs/newserver.log") ;
}
catch(Exception e)
{

#if DEBUG
Console.WriteLine("初始化" + e.Message) ;
#endif//DEBUG
throw(new Exception("初始化" + e.Message)) ;

}


}

注意到其中的#if DEBUG那几句吗?它的作用就是当DEBUG时,在控制台输出异常信息,以便你马上知道出现什么错误,而当不是DEBUG时,那句就不会被编译。

三、断言(Assert)
断言真是一个值得大书特书的好东西,但可惜的是80%的程序员尤其是web程序员不用它,甚至根本就没听说过。很难给断言下一个定义,如果要详细说它的好处,简直都可以写一本书了。简单
展开更多 50%)
分享

猜你喜欢

如何更好更快的debug

ASP
如何更好更快的debug

eMule的Mods是否更快活更好呢

电脑网络
eMule的Mods是否更快活更好呢

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

正确的除错(Debug)方式

编程语言 网络编程
正确的除错(Debug)方式

怎样才能更快更好的减肥 男士女士减肥

男士减肥 睡觉减肥
怎样才能更快更好的减肥  男士女士减肥

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何更好的曝光?

摄影 人像摄影 静物摄影
如何更好的曝光?

如何更快的选择最佳照片?

摄影 人像摄影 静物摄影
如何更快的选择最佳照片?

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《龙腾世纪 审判》使用战士正确输出详细攻略

《龙腾世纪 审判》使用战士正确输出详细攻略

ASP3.0中的流控制能力(1)

ASP3.0中的流控制能力(1)
下拉加载更多内容 ↓