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

时间:2013-08-02 07:29:21

标签: c# winforms fonts gdi

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

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

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命名空间内,因此字体有问题,但我们不知道它是什么。 “参数无效”并未提供有关参数无效的大量信息(这来自底层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,GdiCharSet = 1 ,GdiVerticalFont = False]“,所以我无法弄清楚发生了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

<强>原因: 此错误的常见原因是您将无效值作为参数传递给函数。我的假设是你正在调用你的方法

  ApplyCellStyleToEditingControl(getStyleFromSomeWhere);

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

<强>解决方案:

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