2

我们内部 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 命名空间内,所以字体有问题,但我们不知道它是什么。“参数无效”并没有提供很多关于参数无效的信息(这是来自底层 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 块中并在传递的字体上调用 ToString(),并得到以下内容:“[Font: Name=Microsoft Sans Serif, Size=8.25, Units=3,GdiCharSet=1, GdiVerticalFont= False]",所以我无法弄清楚发生了什么。有任何想法吗?

4

1 回答 1

0

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

  ApplyCellStyleToEditingControl(getStyleFromSomeWhere);

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

解决方案:

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

于 2013-08-02T07:37:56.353 回答