catch中的MessageBox.Show问题

时间:2009-03-20 12:55:00

标签: c# try-catch unhandled-exception

当我尝试运行以下代码时会导致未处理的异常。用我发现的代码进行了大量的推文,如果注释掉MessageBox.Show行,问题就会消失!不同寻常的是,我在代码的其他部分的其他catch {}段中使用了MessageBox.Show语句,没有任何问题。我的问题是,是否有人知道它导致异常的原因?

(P.s Reports_Group_Chooser是一个ComboBox)

守则:

string GroupName= (string)Reports_Group_Chooser.SelectedItem;
byte[] ConfigBytes= new byte[]{};
try{
    ConfigBytes= File.ReadAllBytes("Reports/"+ GroupName.ToLower() +".grp");
}catch{
    MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    Reports_Group_Chooser.Items.RemoveAt(NewGroup);
    Reports_Group_Chooser.SelectedIndex= 0;
}

错误(大部分错误):

  

未处理的例外情况:   System.NullReferenceException:Object   引用未设置为的实例   对象在   System.Windows.Forms.ComboBox.DropDownListBoxFinished   ()[0x00000] at(包装器   远程-调用,以检查)   System.Windows.Forms.ComboBox:DropDownListBoxFinished   () 在   System.Windows.Forms.ComboBox + ComboListBox.HideWindow   ()[0x00000] at   System.Windows.Forms.ComboBox + ComboListBox.OnMouseUp   (System.Windows.Forms.MouseEventArgs   e)[0x00000] at   System.Windows.Forms.Control.WmLButtonUp   (System.Windows.Forms.Message& m)   [0x00000]在   System.Windows.Forms.Control.WndProc   (System.Windows.Forms.Message& m)   [0x00000]在   System.Windows.Forms.ComboBox + ComboListBox.WndProc   (System.Windows.Forms.Message& m)   [0x00000]在   System.Windows.Forms.Control的+ ControlWindowTarget.OnMessage   (System.Windows.Forms.Message& m)   [0x00000]在   System.Windows.Forms.Control的+ ControlNativeWindow.WndProc   (System.Windows.Forms.Message& m)   [0x00000]在   System.Windows.Forms.NativeWindow.WndProc   (IntPtr hWnd,Msg msg,IntPtr wParam,   IntPtr lParam)[0x00000] at   System.Windows.Forms.XplatUIX11.DispatchMessage   (System.Windows.Forms.MSG& msg)   [0x00000]在   System.Windows.Forms.XplatUI.DispatchMessage   (System.Windows.Forms.MSG& msg)   [0x00000]在   System.Windows.Forms.Application.RunLoop   (布尔模态,   System.Windows.Forms.ApplicationContext   上下文)[0x00000]

任何帮助表示赞赏 迈克尔

UPDATE 这是我的代码中一个工作MessageBox.Show的例子,它不会导致错误:

GlobalConfig= new Dictionary<string, string>();
byte[] ConfigBytes= new byte[]{};
try{
    ConfigBytes= System.IO.File.ReadAllBytes("Config.cfg");
}catch{
    MessageBox.Show("Global ettings file does not exist. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    GlobalConfig.Add("StoreNumber","");
    GlobalConfig.Add("Error","Y");
}

更新更新:

似乎问题只是在一个组合框事件中有MessageBox.Show: 以下代码仍然显示相同的错误:

private void Reports_GroupChanged(object sender,EventArgs e){
    MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

3 个答案:

答案 0 :(得分:1)

当您显示MessageBox时,它不会暂停您的应用程序。相反,应用程序继续从操作系统中抽取消息。在影响中,这允许您的UI继续处理。

这里可能发生的事情是,当MessageBox显示时,ComboBox仍在处理鼠标按钮消息和空引用。请尝试拨打以下电话。

System.Diagnostics.Debugger.Break();

答案 1 :(得分:0)

先修复错误。

Reports_Group_Chooser.SelectedIndex= 0;
Reports_Group_Chooser.Items.RemoveAt(NewGroup);    
MessageBox.Show("The file for this group is missing. Cannot continue.","File Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);    

答案 2 :(得分:0)

您应该在显示消息之前解决导致失败的问题。

以下是我的例子。

失败是由将null对象转换为字符串引起的:

string str = dgv[e.ColumnIndex, e.RowIndex].Value.ToString();

然后在catch语句中,我尝试显示消息并将以前的值分配给单元格:

MessageBox.Show(String.Format("Value must be between {0} and {1}.", minVal, maxVal));
dgv[e.ColumnIndex, e.RowIndex].Value = previousValue;

在调用MessageBox期间我得到了null引用异常。

因此,在调用MessageBox(交换行)之前必须修复单元格值,它就像魅力一样。