我的代码的重要部分如下所示:
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();}
}
我想检查这是否是处理此特定异常的正确方法?我注意到有些消息来源正是如此。但是,有些人说永远不要使用throw new Exception
。这是对的吗?
此外,在我关注的教程中,该人运行上面的代码而没有遇到像我这样的异常(因此不需要我添加的if语句)。有人知道为什么吗? VS的先前版本是否会忽略此类型的异常,或者是否会发生其他事情?
答案 0 :(得分:5)
要回答您的第一个问题,if (frame != null)
部分是验证参数不为空的好方法。但是,在else
子句中,抛出更有意义的异常会更好,例如:
else { throw new ArgumentNullException("frame"); }
回答第二个问题:不,以前版本的Visual Studio不会忽略NullReference
个例外。该教程可能会因为简单/可读性(或懒惰)而忽略了一些错误处理。查看调用此方法的代码并尝试找出它传递null frame
的原因是个好主意。
根据this文档,如果数据不再可用,则可以在sensor_ColorFrameReady
方法中传递null。
根据this文档,它不应该在PictureButton_Click
方法中返回null,因为您在0
传递了milisecondsWait。