前两天把数据库服务器和应用服务器分开部署(原来iis和DB都放在一台服务器上),发现服务器的应用程序日志中密密麻麻的全是黄色的警告日志,打开看看,大多数都是说空引用异常等信息问题一:
  这里我对抛出的空引用异常警告信息简单介绍一下:
  我在用户登录的时候使用如下方法保存当前用户的UserName
  HttpContext.Current.Session["UserName"]
  然后在该用户的整个生命周期里都会使用这个Session
  系统日志中抛出的警告信息中就是 在我使用这个Session的时候 使用了未被赋值的对象那么:
1、这个Session是在用户登录的时候被赋值的,以后使用的时候为什么会出问题,而且只是偶尔出问题,并且很有规律,都是在固定的某两个文件中出现,其它使用这个Session的地方多了,为什么都没有问题?
2、既然系统能捕获到这个异常(只是警告信息),但是为什么我的应用程序不会报错?(我没有随便使用Catch吃掉这个异常)问题二:
  我在被提示的代码里加上Try..Catch来吃掉这些异常,目的是不想让Windows发现这个东西,因为我觉得如果系统在拼命的写这些日志会影响到服务器的性能
  改完后发布,问题出来了,虽然系统提示的警告信息明显减少了,可是到下午3点左右,服务器的Cpu竟然被w3wp.exe进程占到了100%,而且一直持续,连着两天都出现这样的情况,于是今天早上我把发布的程序恢复到更新前的版本,到目前为止还没出现这种情况,虽然系统日志中的警告又开始铺天盖地的来,但是Cpu确是很正常那么:
1、是不是因为我加了try..Catch吃异常造成了某方面的死循环呢?
2、有没有人用过AQTime?我想用这个来跟踪一下到底是哪可能会出现问题,但是AQTime好像只能打开并跟踪一个URL,而造成Cpu出现100%的情况是因为大并发的时候才会出现,简单的说我想跟踪所有人的URL,但是不现实,因为所有人的并发访问在服务器上都在一个w3wp.exe进程里,或许可以跟踪服务器上那个w3wp.exe进程,然而AQTime又提示说不能把已经在...环境下运行的..附加到进程里,郁闷,有办法解决吗?谢谢

解决方案 »

  1.   

    首先在系统中。特别是网站中。不能大量使用try ..catch 语句,特别是使用Exception 将所有的异常全部获取.try catch中又没有对错误进行处理。使用了HttpContext.Current.Session["UserName"] 要记得,session 是有一个超时时间的,看一下你的超时间是否设置了,如果超时了,session是会丢去的!
      

  2.   

    B/S系统用try ..catch语句并不是很多,我觉得能够避免尽量避免,有些地方还可以用using来代替
      

  3.   

    还是应该看看代码``在自己机器上调试跟踪下``
    session要么过期了``
    要么没赋值``
    要么session["value"]中value得名字拼写错了``
      

  4.   

    都是在固定的某两个文件中出现?这还不好找错误么?
    在使用 Session 进行判断
    if(Session["x"] != null)
    {
     //执行操作
    }
    不过,提示使用了为赋值的变量,应该不会出现在Session["x"]这行上吧。
    使用了未被赋值的对象,一般在这种情况下会出现string x;
    if(条件 )
    {
     x = "";
    }
    Response.Write(x);关于Try应该尽量减少使用,是比较占用资源的。
    比如,IO读写,事先判断File.Exists(f),而不是进行try进行操作。
    再比如,整除运算之前,进行判断分母是否为0,比使用Try高效得多。
    对于可预料的错误,应先处理,而不是都放到Try里面去。对于W3wp占用100%,应当对程序进行优化处理,即使释放使用的对象实例等等。
      

  5.   

    谢谢大家
    谢谢孟子老大发帖子那天比较心烦意乱(不全都是工作上的事情)
    现在看来感觉自己对帖子的阐述比较罗嗦(竟然有那么大的篇幅,很感谢各位能耐心的看完)其实现在总结起来就两个问题
    1、系统日志中总是提示空引用异常的问题
    我的解决方法是(像孟子老大说的那样)在使用session之前加了判断
    if(Session["x"] != null){。}同时,加上了try{} catch{/*do nothing*/}
    目的是(双保险)不想让系统写那么多无聊的日志2、程序发布以后,发现,系统的警告日志的确减少了,但是cpu总是一段时间之后会被w3wp进程占用到100%,因此我怀疑是因为胡乱添加了try{} catch{/*do nothing*/}之后造成了某个方法死循环可能有人会问,为什么try{} catch{/*do nothing*/}还能造成死循环的确有这种可能在某种while循环中,加入try{} catch{/*do nothing*/},而偏偏这个catch没有做任何处理,很有可能导致死循环,而我今天突然想起来好像在哪个while中加入了try{} catch{/*do nothing*/}因为那天心情不爽,为了快速解决日志的问题,所以在代码中胡乱的加了一些try{} catch{/*do nothing*/}而没做太多的思考,因此这个可能是造成cpu占用100%的根源所在现在还只是猜测,等周一修改代码并重新发布一下程序之后再观察一下,希望问题能解决。。
      

  6.   

    猜中了
    问题已经解决结论:
    try catch 是绝对不能乱加的,占用资源不说,还很有可能造成不必要的麻烦例如死循环等问题(尤其是在Catch中不做任何处理的情况下)