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

Jim*_*myK 2 c# exception-handling nullreferenceexception kinect-sdk visual-studio-2013

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

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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();}
    }
Run Code Online (Sandbox Code Playgroud)
  1. 我想检查这是否是处理此特定异常的正确方法?我注意到有些消息来源正是如此.但是,有些人说从来没有使用过throw new Exception.它是否正确?

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

Ruf*_*s L 5

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

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

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

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

根据这个文档,它不应该在你的PictureButton_Click方法中返回null ,因为你传入0了milisecondsWait.