点滴经验 - 1

来源:互联网 发布:openflow neutron网络 编辑:程序博客网 时间:2024/05/06 10:53

前几天写了个新功能,即接受用户参数,然后读取数据,用Ajax联动方式呈现给用户,功能比较简单。

功能写好后,在本机上运行一切正常,但放到公司测试用的服务器上时,出现了错误,运行非常慢,而且不出结果,最终,我利用Visual Studio的性能分析,查出了是数据库读取时耗时过多,再次根踪,发现是参数化查询的问题,仔细检查发现,当参数值为空的时候,会导致查询非常缓慢,经过查阅资料得知,要把参数值设置为空时,不能用null,而要用DBNULL.Value

再次放到服务器上运行,正常了,可过了几天,正式部署后,打印功能出现问题,报告 System.Threading.ThreadAbortException,经过仔细排查,我确定我的程序没有问题,于是把注意力转到打印接口上,由于是远程在服务器上测试,速度非常慢,利用输出标记的方法,我发现在Response.End方法处出现了问题,经提问,得知Response.End不能放在try-catch里,于是我把打印接口程序改写了一下,再次运行出现了另外的错误,找了一天也没找出是哪里出错了,第二天,我突然想到会不会是打印接口的子方法出问题了,于是我定位到它的子方法,直接把结果通过异常抛出来,然后发现结果不对,于是再更深一层的定位到子方法所调用的数据库处理类,果然,问题出在这里,这里的代码使用try-catch捕获了异常,却没有对异常进行处理,导致返回的结果不对,于是我把异常进行了抛出处理,再次运行程序,发现异常信息显示出来了,阅读异常信息(纯英文的,凭借着对关键词的敏感,我猜出了意思,英语不好是硬伤啊,得补),发现问题出在数据库的连接上,数据库连接不上,会不会是数据库连接字符串不对呢?于是我层层追踪,找到了数据库连接字符串是放在一个dll文件里(你会觉得惊异吗?),由于没有源代码,我只能尝试反编译,结果反编译器打不开,接着,有可能是人品爆发吧,我试着用记事本打开这个dll,结果真打开了,原来只是改了个后缀来欺骗人的,经检查,连接字符串还是开发机上的配置,改正运行,OK,程序正常了。

总结:

1Response.End()不能用在try-catch中,否则会出现System.Threading.ThreadAbortException。

2、捕获了异常就要处理或者输出,不然无法定位错误源。

3、一套程序能在本机上运行,不代表能在服务器上运行,能在一台服务器上运行,不代表能在所有服务器上运行。

4、产品交给别人使用时,一定要有详细的说明文档。

 

有错误的地方,望大神们指正

原创粉丝点击