WPF专业编程指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.8 应用程序的异常处理

现代软件工程有一个基本的出错处理原则:就近处理程序异常。比如说,你有如下Class A和Class B两段程序:

  public Class A
  {
//...
      protected  float Divide( float x, float y )
    {
      float z = x/y;
      return z;
    }
  }
  public Class B: A
  {
  //...
  public void Calc()
  {
      float[]  x={100.2, 22.5,.....};
      float[]  y =( 500.0, 2.5,....};
      for( int i = 0; i < x.Length; i++ )
      {
            z= divide( y[i],x[i]);
            //...
      }
  }
  }

这两段程序在正常的情况下,没什么问题,但如果Class A中的y为0,那么z=x/y就会出错,一般情况下,我们需要把Class A中的方法Divide改为:

  protected float Divide(float x, float y)
      {
        float z = 0;
        try
        {
            z = y / x;
        }
        catch
        {
            //处理异常
        }
        return z;
      }

即我们需要在最可能出现异常的地方加上try{} catch{} ,从而对程序异常加以处理。 这一原则说起来简单,做起来难,一旦有一个地方没有对异常进行适当的处理,可能会导致整个软件,甚至整个操作系统的崩溃。WPF的Application类中有一个事件:DispatcherUnhandledException,这个事件在应用程序未对其中的异常加以处理的情况下发生。我们可以对该事件进行处理,从而为应用程序把好最后的大门:

  protected override void OnStartup(StartupEventArgs e)
      {
        ...
        this.DispatcherUnhandledException += new
        System.Windows.Threading.
        DispatcherUnhandledExceptionEventHandler(
        App_DispatcherUnhandledException);
      }
      void App_DispatcherUnhandledException(object sender,
            System.Windows.Threading.
            DispatcherUnhandledExceptionEventArgs e)
      {
      //对程序异常进行处理
      }