你没有想到的Global.asax怪事!

  或许有些人会这样写他们的初始化代码:

    void Application_Start(object sender, EventArgs e) 
    { 
        //在应用程序启动时运行的代码 
        try { 
            AppInitializer.Init(); 
        } 
        catch( Exception ex ) { 
            LogException(ex); 
             
            // ..................... 
        } 
    }

  这段代码有什么问题呢?

  其实问题的线索在于:为什么要加try....catch语句,是因为知道可能会发生异常吗?

  如果真有异常情况发生,这样处理后,后续的请求是不是会发生各种想像不到的错误?

  显然这里不能吃掉异常,要不然后面的请求肯定会有问题,因为它们依赖的设置没有正确的初始化。

  好吧,那我去掉 try.....catch语句,这样总该行了吧:

    void Application_Start(object sender, EventArgs e) 
    { 
        //在应用程序启动时运行的代码 
        AppInitializer.Init(); 
    }

  还是看来一下真实的运行情况吧。

  噢,抱歉,我还真忘记了配置连接字符串,这个异常提示太给力了。

  现在加上连接字符串吗?

  别急,想像一下,如果这个网站是一个真实的在线网站,会是什么情况呢?

  答案有二种:

  1、另一个用户也发起了一次请求。

  2、当前用户看到错误页面后,重新刷新了一次当前页面。

  现在我用Opera来扮演第二个浏览用户吧,还是打开同样的网址。

  太奇怪了,第二个用户居然能打开页面,好吧,让他登录试试。

  结果第二个用户看到的错误情况和第一个用户完全不同。

  如果此时第一个用户刷新他的浏览器,发现页面又可以显示了,然而登录时,会看到与第二个用户一样的异常信息。

  这个示例代码实在太简单了,我想维护人员根据NullReferenceException这个线索找下去,很快能找到答案。如果初始化代码再复杂一些,比如SetSqlDependency()中出现异常呢,那么程序仍然能够正常运行,但是我们期望的缓存依赖可能没有效果了,终可能会产生性能问题,排查的难度会大多了。