Это хороший способ обработки исключений. то есть, используя Try Block, когда вы можете обработать исключение и восстановить его? - PullRequest
0 голосов
/ 10 октября 2019

Пользователь может вводить даты в формате, используя / или - в качестве разделителя.

Следующий try блок работает для /, но не для - и наоборот:

Try
{
    caseData.AddRange(
        JsonConvert.DeserializeObject<List<CaseInfo>>(
                jObject["caseData"].ToString(), 
                new JsonSerializerSettings { DateFormatString = "d/M/yyyy" }));
}
Catch(Exception)
{

    caseData.AddRange(
        JsonConvert.DeserializeObject<List<CaseInfo>>(
            jObject["caseData"].ToString(), 
            new JsonSerializerSettings  { DateFormatString = "d-M-yyyy" }));

}

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Краткий ответ: Нет.

Структура try-catch довольно дорогая с точки зрения ресурсов. С точки зрения дизайна, это тоже неправильно;исключение должно быть именно таким: исключение - что-то необычное, возможно, ошибка. То, как вы используете его здесь, это просто проверить, какой из двух допустимых форматов использовать.

По сути, здесь вы используете обработку исключений в качестве вычислительно дорогой операции if-else.

Лучшим решением может быть попытка сначала извлечь содержимое jObject["caseData"] и явно проверить его формат, чтобы узнать, какую опцию использовать. Как только вы это узнаете, вы можете использовать обычную структуру if-else, чтобы решить, как ее десериализовать.

Что-то вроде:

var dateText = jObject["caseData"].ToString();
var matchingFormat = dateText.Contains("/") ? "d/M/yyyy" : "d-M-yyyy";

caseData.AddRange(
    JsonConvert.DeserializeObject<List<CaseInfo>>(
        jObject["caseData"].ToString(), 
        new JsonSerializerSettings  { DateFormatString = matchingFormat }));

Примечание. Предполагается, что вы достаточно уверены, что можете верить, что ввод будет в одном из двух форматов. Возможно, вы захотите добавить дополнительную проверку, особенно если конечным пользователям можно свободно манипулировать с полем даты.

1 голос
/ 10 октября 2019

То, что сказал @Kjartan плюс следующее.

Решение DateFormatString может не работать должным образом, если у вас есть несколько полей даты, и пользователь вводит несколько дат в разных форматах.

Вотнекоторые варианты, которые вы могли бы рассмотреть, все со своими плюсами и минусами:

  1. Есть отдельные поля для года, месяца и дня для каждой даты;
  2. Заставить API принимать только даты взаданный формат и заставьте поставщика источника json справиться с этим;
  3. Предварительный анализ исходных данных и форматирование всех дат;
  4. Создание CaseInfo сохранения дат в виде строки и предоставление средств доступа, которые выполняют преобразование;
  5. Создание пользовательских JsonConverter, возможно, на основе DateTimeConverterBase , и пометьте свои проблемные свойства с помощью [JsonConverter(typeof(MyResilientDataFormatJsonConverter))].

Общее примечание : синтаксический анализ дат становится быстрым, если вы поддерживаете несколькоформаты и / или культуры. Например: сегодня 10/09/2019 или 09/10/2019?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...