Windows窗体:“;System.ArgumentException:参数无效";来自系统堆栈

本文关键字:quot 系统 堆栈 参数 窗体 System ArgumentException Windows 无效 | 更新日期: 2023-09-27 18:25:51

我们内部WinForms应用程序上的未处理异常处理程序定期报告此错误,以及生产中使用的相同错误的变体(我们将其配置为每当发生未处理异常时都会向我们发送电子邮件)。然而,它是不可复制的,并且在不同的用户机器上以随机间隔出现,这些机器都是XP SP3。

它似乎与数据网格中的屏蔽文本框有关,但在许多屏幕上的几十个控件中,它似乎只出现在同三个控件中。这些控件没有指定任何字体。

System.ArgumentException: Parameter is not valid.
   at System.Drawing.Font.GetHeight(Graphics graphics)
   at System.Drawing.Font.GetHeight()
   at System.Drawing.Font.get_Height()
   at System.Windows.Forms.Control.set_Font(Font value)
   at System.Windows.Forms.DataGridViewComboBoxEditingControl.ApplyCellStyleToEditingControl(DataridViewCellStyle dataGridViewCellStyle)
   at System.Windows.Forms.DataGridView.BeginEditInternal(Boolean selectAll)
   at System.Windows.Forms.DataGridView.ProcessKeyEventArgs(Message& m)
   at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   at System.Windows.Forms.Control.WmKeyChar(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam,
IntPtr lparam)

真正让我困惑的是,堆栈跟踪完全在System命名空间中,所以字体有问题,但我们不知道它是什么。"Parameter is not valid"并没有提供很多关于参数无效部分的信息(这来自底层GDI库)。

我们还得到了一个类似的异常,它在我们的一个类中传播,这使我能够捕获错误:

System.ArgumentException: Parameter is not valid.
   at System.Drawing.Font.GetHeight(Graphics graphics)
   at System.Drawing.Font.GetHeight()
   at System.Drawing.Font.get_Height()
   at System.Windows.Forms.Control.set_Font(Font value)
   at MyApp.MaskedTextBoxEditingControl.ApplyCellStyleToEditingControl(DataGridViewCellStyle
dataGridViewCellStyle)

有问题的代码只是这样:

public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle){
  this.Font = dataGridViewCellStyle.Font; 
  // set other things
}

我把这一行封装在try/catch块中,并对传递的Font调用ToString(),得到了以下结果:"[Font:Name=Microsoft Sans Serif,Size=8.25,Units=3,GdiHarSet=1,GdiVerticalFont=False]",所以我不知道发生了什么。有什么想法吗?

Windows窗体:“;System.ArgumentException:参数无效";来自系统堆栈

原因:出现此错误的常见原因是将无效值作为参数传递给函数。我的假设是,你把你的方法称为类似的东西

  ApplyCellStyleToEditingControl(getStyleFromSomeWhere);

现在,在上面的示例中,getStyleFromSomeWhere无效,因此抛出异常

解决方案:

这里最好的解决方案是,当你收到这个异常(并且收到电子邮件)时,你也会将参数发送给自己。通过这种方式,您可以诊断异常发生时参数的值,并诊断根本原因。