如何处理异常以及为什么有时可能会忽略它们

时间:2014-10-22 17:41:33

标签: c# exception-handling visual-studio-2013 nullreferenceexception kinect-sdk

我的代码的重要部分如下所示:

sensor.ColorFrameReady += sensor_ColorFrameReady;

void sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs colorImageFrameReadyEventArgs)
    {
        using (var frame = colorImageFrameReadyEventArgs.OpenColorImageFrame())
        {
            var bitmap = CreateBitmap(frame);
            Canvas.Background = new ImageBrush(bitmap);
        }
    }

private static BitmapSource CreateBitmap(ColorImageFrame frame)
    {
        var pixelData = new byte[frame.PixelDataLength];
        frame.CopyPixelDataTo(pixelData);
        var stride = frame.Width * frame.BytesPerPixel;
        var bitmap = BitmapSource.Create(frame.Width, frame.Height, 96, 96, PixelFormats.Bgr32, null, pixelData, stride);
        return bitmap;
    }

private void PictureButton_Click(object sender, RoutedEventArgs e)
    {
        using(var frame = sensor.ColorStream.OpenNextFrame(0))
        {
            var bitmap = CreateBitmap(frame);
            Canvas.Background = new ImageBrush(bitmap);
        }
    }

每当我运行我的应用程序时,我都会收到错误:"未处理的类型' System.NullReferenceException'发生&#34 ;.这发生在我的BitMapSource方法的第一行。

我通过在我的BitmapSource方法中添加以下if语句来修复此问题:

private static BitmapSource CreateBitmap(ColorImageFrame frame)
    {
      if(frame != null)
      {
         var pixelData = new byte[frame.PixelDataLength];
         frame.CopyPixelDataTo(pixelData);
         var stride = frame.Width * frame.BytesPerPixel;
         var bitmap = BitmapSource.Create(frame.Width, frame.Height, 96, 96, PixelFormats.Bgr32, null, pixelData, stride);
         return bitmap;    
      }
      else {throw new Exception();}
    }
  1. 我想检查这是否是处理此特定异常的正确方法?我注意到有些消息来源正是如此。但是,有些人说永远不要使用throw new Exception。这是对的吗?

  2. 此外,在我关注的教程中,该人运行上面的代码而没有遇到像我这样的异常(因此不需要我添加的if语句)。有人知道为什么吗? VS的先前版本是否会忽略此类型的异常,或者是否会发生其他事情?

1 个答案:

答案 0 :(得分:5)

  1. 要回答您的第一个问题,if (frame != null)部分是验证参数不为空的好方法。但是,在else子句中,抛出更有意义的异常会更好,例如:

    else { throw new ArgumentNullException("frame"); }

  2. 回答第二个问题:不,以前版本的Visual Studio不会忽略NullReference个例外。该教程可能会因为简单/可读性(或懒惰)而忽略了一些错误处理。查看调用此方法的代码并尝试找出它传递null frame的原因是个好主意。

  3. 根据this文档,如果数据不再可用,则可以在sensor_ColorFrameReady方法中传递null。

    根据this文档,它不应该在PictureButton_Click方法中返回null,因为您在0传递了milisecondsWait。