Vb.net 如何处理ArgumentOutOfRangeException?

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

我有一个PictureBox控件。当我单击控件上的图像时,事件处理程序被触发

以下是事件处理程序:

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