Как отловить null в ComboBox.SelectedItem?

184
16 июля 2018, 21:00

Есть кусок кода, который формирует путь по шаблону с добавлением выбранных пунктов. WorkerList - это и есть ComboBox.

            string TargetHost = HostBox.Text;
            string WorkDirectory = @"C:\worker\" + SQLget.WorkerName(WorkerList.SelectedItem.ToString()) + "\\";

Далее идёт кнопка, которая по нажатию, в директорию копирует файлы и ставит задание. Если ComboBox пуста - я поймаю нулРефЭкс, что справедливо.

Своими граблями я так и не дошёл, почему не отлавливается в catch. Что сделал:

        private void TaskButton_Click(object sender, EventArgs e) // Кнопка на вкладке планировщика. Размещает задания на сбор базы и ёё копирования.
    {
        try
        {
            string TargetHost = HostBox.Text;
            string WorkDirectory = @"C:\worker\" + SQLget.WorkerName(WorkerList.SelectedItem.ToString()) + "\\";
            SetState.CreatTask(TargetHost, WorkDirectory, true);
            SetState.CreatCopyTask("ещё больше аргументов");
        }

Далее я пробую так:

            catch (Exception) when (IndexerList.SelectedItem.ToString() == null)
        {
            MessageBox.Show("Пусто!", "Ошибка");
        }

Но, как вы поняли из темы, не взлетело.

Пробовал добавлять в тело трай такую фигню(сам нутром чую, что бред какой-то)

                if (IndexerList.SelectedItem == null)
            {
                throw new NullReferenceException("Выберите индекс");
            }

Так как у меня два поля(TextBox, ComboBox), я хочу чтобы на каждое незаполненное поле ловить своё исключение. В случае catch-when как у меня, событие не вызывается. Можно смело тыкать носом в главу учебника или или в msdn, где будет описано как отладить. Кармический монплезир гарантирую.

Answer 1

Когда IndexerList.SelectedItem равен null, в конструкции

try { }
catch (Exception) when (IndexerList.SelectedItem.ToString() == null) { }

валится NullReferenceException, вот здесь: when (IndexerList.SelectedItem.ToString() == null) Поэтому в этот блок catch ты никогда не попадешь.

Правильнее делать так:

try { }
catch (NullReferenceException) when (IndexerList.SelectedItem == null) { }
catch { }

А еще лучше, вообще не провоцировать ексепшн, а вместо этого делать простую проверку:

private void TaskButton_Click(object sender, EventArgs e)
{
    if (HostBox.Text == null)
    {
        MessageBox.Show("Пусто!", "Ошибка 1");
        return;
    }
    if (WorkerList.SelectedItem == null)
    {
        MessageBox.Show("Пусто!", "Ошибка 2");
        return;
    }
    // дальше делаешь, что хочешь...
}
READ ALSO
C# Разгадываниe текста по картинке

C# Разгадываниe текста по картинке

У меня есть картинка с текстом написанным необычным шрифтом

147
IAsyncOperation<StoreProductResult> не содержит определения для GetAwaiter

IAsyncOperation<StoreProductResult> не содержит определения для GetAwaiter

Есть проект на Xamarin Forms наnet standart 2

187
C#, MDI и его процесс загрузки

C#, MDI и его процесс загрузки

Есть родительская форма EditData, и дочерняя форма DataClassКак только открываю дочернюю форму там идет выгрузка данные с MS SQL в DataGridView, очень долго...

228
WPF в С# проблема с custom

WPF в С# проблема с custom

Есть код XAML и есть класс CustomVisualFrameworkElement, который унаследован от FrameworkElement и реализует с помощью Visual некоторые фигурыНо XAML почему то не видит...

164