Try-Catch против If-Else |Должен ли я бороться, чтобы использовать If-Else в этом или просто пойти с Try-Catch? - PullRequest
0 голосов
/ 13 марта 2019

Сводка


Мне дали задание настроить программное обеспечение для управления (для небольшого художника, так что его оборудование определенно может справиться), однако япредпочел бы сделать это как можно более эффективным, прежде чем дать им это.Основная функциональность выполнена, и теперь она в основном просто дорабатывается и оптимизируется.

Код


        DateTime DueDate;
        try
        {
            DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
            out DueDate);
        }
        catch(Exception E)
        {
            MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
                MessageBoxButton.OK, MessageBoxImage.Warning);
            DueDate = DateTime.Parse(DateTime.Now.ToShortDateString());
        }

Примечание: Exception e был использован толькочтобы сделать это быстро, и истинное исключение известно.Приводится ошибка: «Обнуляемый объект должен иметь значение».System.InvalidOperationException

Вопрос


Лучше ли справляться с этим так, как я, или лучше будет работать If-Else?И если да, то как бы я это реализовал?

Ответы [ 4 ]

3 голосов
/ 13 марта 2019

Поскольку вы уже используете TryParse, нет необходимости использовать блок try ...catch.Не только неэффективно, но и не чисто.Просто возьмите возвращаемое значение DateTime.TryParse и примите решение.

var isDate = DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),

, а затем if (isDate){...} else {...}

2 голосов
/ 13 марта 2019

Исключение e использовалось только для быстрого выполнения, и истинное исключение известно. Приводится ошибка: «Обнуляемый объект должен иметь значение». System.InvalidOperationException

Как вы узнали бы, что во время выполнения это будет другим исключением? скажем, NullReferenceException (например) может быть. Помните, что все исключения реализуют объект Exception.

Лучше ли справляться с этим так, как я, или лучше будет работать If-Else?

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

И если так, как бы я это реализовал?

try
{
    if(dteCommission.SelectedDate.HasValue) 
    { 
        DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
                    out DueDate); 
    } else{
        MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                DueDate = DateTime.Parse(DateTime.Now.ToShortDateString());
    }
} 
catch(Exception e)
{
    Log.LogError(e);
    MessageBox.Show("Unhandle error occurred please call Admin", "Alert",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
}
1 голос
/ 13 марта 2019

Если вы намерены использовать tryparse, то лучше использовать If-Else, который зависит от результата метода tryparse. но если вы используете Parse, вполне вероятно, что вы получите одно из следующих исключений:

  • ArgumentNullException (если значение параметра равно нулю)
  • FormatException (Если значение параметра отличается от целочисленного значения или не в правильном формате)
  • FormatException (если значение параметра выходит за пределы целочисленного диапазона)

так что лучше пойти с обработкой исключений.

для первого подхода:

var isParsable = DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
out DueDate);
if (isParsable)
{
     //Continue With your Procedure
}
else
{
     MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
     MessageBoxButton.OK, MessageBoxImage.Warning);
}

для второго случая вы можете пойти с:

DateTime DueDate;
try
{
     var DueDate = DateTime.TryParse(dteCommission.SelectedDate.Value.ToString());

}
catch (Exception E)
{
     MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
     MessageBoxButton.OK, MessageBoxImage.Warning);
     //also you can you the exception type to make it clear for use if it is
     // an exception of Null, Format or Argument
}
0 голосов
/ 13 марта 2019

Я хотел бы предложить использовать оператор if для такого сценария, а не исключения, он также будет оптимизирован и даст вам возможность дать осмысленное сообщение, относящееся к сценарию.

Обработка исключенийследует использовать только для обработки неизвестных сценариев.

...