Vb.net 如何处理ArgumentOutOfRangeException?
我有一个PictureBox控件。当我单击控件上的图像时,事件处理程序被触发 以下是事件处理程序:Vb.net 如何处理ArgumentOutOfRangeException?,vb.net,winforms,Vb.net,Winforms,我有一个PictureBox控件。当我单击控件上的图像时,事件处理程序被触发 以下是事件处理程序: Private Sub pbImageHolder_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles pbImageHolder.Click Dim clickPoint As Point = MousePosition Dim img As Bitm
Private Sub pbImageHolder_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles pbImageHolder.Click
Dim clickPoint As Point = MousePosition
Dim img As Bitmap = New Bitmap(pbImageHolder.Image)
pixelColor = img.GetPixel(clickPoint.X, clickPoint.Y)
For i As Integer = 0 To img.Width
For j As Integer = 0 To img.Height
Next
Next
End Sub
问题是我在这一行:
pixelColor = img.GetPixel(clickPoint.X, clickPoint.Y)
这是一个例外:
System.ArgumentOutOfRangeException未处理Message=参数必须为正且<宽度 参数名称:x
ParamName=x
来源=系统图纸
知道如何修复代码吗?假设SizeMode是默认的正常值(参见下面Hans的评论),MouseClick事件将是一个更合适的事件来处理,而不是单击,因为它将为您传递鼠标位置 此外,还需要检查该点是否在图像的边界内
Private Sub pbImageHolder_MouseClick(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles pbImageHolder.MouseClick
Using img As Bitmap = New Bitmap(pbImageHolder.Image)
If New Rectangle(Point.Empty, img.Size).Contains(e.Location) Then
pixelColor = img.GetPixel(e.Location.X, e.Location.Y)
For i As Integer = 0 To img.Width - 1
For j As Integer = 0 To img.Height - 1
Next
Next
End If
End Using
End Sub
对于循环,确保比宽度和高度小一个
除非您不知道范围,否则不需要对此错误进行Try-Catch,但在这种情况下,您知道范围与图像的大小有关。防御性编程(测试空值和超出范围的变量值)和使用适当的Try/Catch块的组合(如果你想在你的防守策略“失败”时尝试“修复”它,你甚至可以
捕获ArgumentOutOfRangeException
异常本身)。PictureBox.SizeMode弄乱了这段代码。就像对OP所做的那样。@HansPassant很有道理。OP还使用了鼠标位置——这不太好。
Private Sub pbImageHolder_MouseClick(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles pbImageHolder.MouseClick
Using img As Bitmap = New Bitmap(pbImageHolder.Image)
If New Rectangle(Point.Empty, img.Size).Contains(e.Location) Then
pixelColor = img.GetPixel(e.Location.X, e.Location.Y)
For i As Integer = 0 To img.Width - 1
For j As Integer = 0 To img.Height - 1
Next
Next
End If
End Using
End Sub