Как в общем случае зарегистрировать уязвимую строку в FormatException? - PullRequest
0 голосов
/ 20 февраля 2019
DateTime MyDateTime;
try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
    //many other lines
}catch(Exception e){
    Log(e);
}

У меня есть функция синтаксического анализа, в которой, помимо прочего, string преобразуется в DateTime объект.В большинстве случаев это работает, но иногда входная строка может находиться в другом DateFormat или содержать дополнительные строки, и преобразование завершается неудачей.
Для обработки этих случаев мне нужно знать, какие строки вызывали проблемы. Сообщение об исключении не скажет мне:

System.FormatException: строка не была распознана как допустимый DateTime.Существует неизвестное слово, начинающееся с индекса 0.

Даже при преобразовании в FormatException объект исключения не предоставляет проблемную строку ввода:

try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
    //many other lines
}catch(FormatException e){
    Log(e);
}

Что мне нужносделать, чтобы получить такой журнал?

System.FormatException: строка не была распознана как допустимый DateTime.Есть неизвестное слово, начинающееся с индекса 0.
Ввод: '2019.02.20'

Конечно, я мог бы охватить каждую строку в коде одним блоком try-catch

DateTime MyDateTime;
try{
    MyDateTime = DateTime.Parse(datestring, MyCultureInfo).Date;
}catch(Exception e){
    Log(e);
    Log($"Input: '{datestring}'");
}
try{
  //many other lines
}catch(Exception e){
    Log(e);
}

Но это отстой.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Да, вам придется обслуживать все места, где вам не удастся включить строку.Хотя я хотел бы избежать кодирования по исключению и кода, чтобы предположить, что это не удастся.Например,

    var dateTimeString = "2015494";
    if(!DateTime.TryParse(dateTimeString, out DateTime result))
    {
        Log();
    }
0 голосов
/ 20 февраля 2019

Но это отстой.

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

Большинство каркасов журналирования имеют метод Log, который принимает исключение и дополнительное сообщение.В этом случае вы, вероятно, можете написать что-то вроде:

Log(e, $"Unable to parse DateTime {datestring}");

Конечно, вы можете создать метод-оболочку вокруг DateTime.Parse, который выдает свое собственное исключение.Что-то вроде:

private static DateTime ParseDate(string input)
{
    try
    {
        return DateTime.Parse(input, MyCultureInfo).Date;
    }
    catch (FormatException e)
    {
        throw new FormatException($"Unable to parse DateTime '{input}': {e.Message}", e);
    }
}
...