Как более аккуратно обработать это исключение?

Я пытался перечислить свойства класса и получить их значения в списке строк. Но я столкнулся с проблемой, когда я получаю исключение NullReferenceException, когда значение null из свойств

Мне удалось исправить это с помощью этого решения, но все же я не считаю это чистым кодом.

Интересно, можно ли это реализовать более чистым и профессиональным способом.

    private int CalculateScore()
    {
        var score = 0;
        var answers = new List<string>();
        foreach (var prop in typeof(TypesSheet).GetProperties())
        {
            // WHEN STRING IS MISSING IT BREAKS
            try
            {
                var answer = prop.GetValue(_typesSheet).ToString();
                answers.Add(answer);
            }
            catch
            {
                continue;
            }


        }

        if (_gameMode == GameMode.SinglePlayer)
        {
            foreach (var answer in answers)
            {
                if (string.IsNullOrEmpty(answer))
                    continue;

                score = score + 10;
            }

            return score;
        }
  }

Пробный улов - ужасная идея. В конечном итоге вы проглатываете фатальные исключения. А их проглатывание - смертный грех обработки исключений: blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/… Это исключение очень тупоголовое. Очевидным решением было бы проверить значение null перед его использованием. Помимо простого кода if (x != null), существует множество сокращений, таких как оператор объединения с нулевым значением и условные операторы с нулевым значением.

Christopher 26.10.2018 20:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
56
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

if (prop.GetValue(_typesheets) != null) {
    answers.Add(prop.GetValue(_typesheets));
}
Ответ принят как подходящий

Заменять:

// WHEN STRING IS MISSING IT BREAKS
try
{
    var answer = prop.GetValue(_typesSheet).ToString();
    answers.Add(answer);
}
catch
{
    continue;
}

С участием:

var value = prop.GetValue(_typesSheet);
if (null != value)
{
    answers.Add(value.toString());
}

Программа аварийно завершает работу до того, как достигнет условия if.

Omar Alaa 26.10.2018 20:38

о, это было о ToString (); функция, вы не можете сделать это с нулевой ссылкой, моя проблема.

Omar Alaa 26.10.2018 20:40

Ошибка была вызвана prop.GetValue(_typesSheet), возможно, null. при использовании метода ToString получите

nullreferenceexception

Вы можете попробовать использовать linq вместо foreach.

var answers =
    typeof(TypesSheet).GetProperties()
    .Select(x => x.GetValue(_typesSheet))
    .Where(x=> x!= null)
    .Select(x=> x.ToString());

Используйте Оператор безопасной навигации (доступно в C# 6)

var answer = prop.GetValue(_typesSheet)?.ToString();
if (!string.IsNullOrEmpty(answer)) answers.Add(answer);

Версия Linq

var answers = typeof(TypesSheet)
                .GetProperties()
                .Select(prop => prop.GetValue(_typesSheet)?.ToString())
                .Where(answer => !string.IsNullOrEmpty(answer))
                .ToList();

Другие вопросы по теме