在c#中捕获异常的问题

时间:2013-02-18 11:23:26

标签: c# exception combobox buttonclick

我有两个项目的组合框。我还有一个按钮,当选择其中一个项目时,它会打开一个新表格。但是,如果没有选择任何项目,则会出现异常(nullpointer)。我已经尝试(无济于事)捕获此异常并显示一个提示用户选择其中一个项目的mbox。

以下是按钮单击的代码:

if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }

3 个答案:

答案 0 :(得分:2)

在非特殊情况下,您不应该使用流控制异常。用户没有选择任何东西的情况肯定不是特例。

正确的方法是进行简单的null检查:

if(cbTable.SelectedItem == null)
{
    // Show message box
}
else
{
    // Your current code
}

为什么你的异常处理代码不起作用是不可能回答的,因为你没有在你的问题中包含它。

答案 1 :(得分:0)

我认为问题在于:

ss = dtGrid1.CurrentCell.Value.ToString();

您无法确定该值是否为null,因此您应在调用.ToString()之前检查它。

您可以使用RequiredValidator执行javascript验证,而不是使用消息框,从而避免无用的回发。

答案 2 :(得分:0)

从性能和可读性的角度来看,我建议在组合框中检查选定的值,而不是捕获异常,如下所示

if(cbTable.SelectedItem == null)
{
         MessageBox.Show("Please select a value in the combo box.");
         return;
}

if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }

但是要回答您的特定查询,您可以像这样抓住NullReferenceException

 try{
        if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
        {
            string name;
            string ss;
            foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
            {
                ss = dtGrid1.CurrentCell.Value.ToString();
                name = dtGrid1.SelectedCells[1].Value.ToString();
                BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                bmw.Label2.Text = ss;
                bmw.Label1.Text = name;
                bmw.ShowDialog();
            }
        }
    }
    catch(NullReferenceException ex)
    {
         MessageBox.Show("Please select a value in the combo box.");
    }