在c#中捕获异常时出现问题

本文关键字:问题 捕获异常 | 更新日期: 2023-09-27 18:00:08

我有一个包含两个项目的组合框。我还有一个按钮,当选择其中一个项目时,它会打开一个新表单。但是,如果没有选择任何项,则会出现异常(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();
            }
        }

在c#中捕获异常时出现问题

在非异常情况下,不应该使用异常进行流控制。用户没有选择任何内容的情况肯定不是例外。

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

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

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

我认为问题出在这一行:

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

您不能确定该值不是null,所以在调用.ToString().之前应该检查它

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

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

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.");
    }