Библиотека LINQ to CSV - Обработка ошибок

ОГЛАВЛЕНИЕ

Обработка ошибок

  • Исключение
    • LINQtoCSVException
      • BadStreamException
      • CsvColumnAttributeRequiredException
      • DuplicateFieldIndexException
      • RequiredButMissingFieldIndexException
      • ToBeWrittenButMissingFieldIndexException
      • NameNotInTypeException
      • MissingCsvColumnAttributeException
      • TooManyDataFieldsException
      • TooManyNonCsvColumnDataFieldsException
      • MissingFieldIndexException
      • MissingRequiredFieldException
      • WrongDataFormatException
      • AggregatedException

Когда методы Read и Write обнаруживают ситуацию, связанную с появлением ошибки, они порождают исключение со всей информацией, которая необходима для решения проблемы. Все исключения унаследованы от класса .NET Exception.

Извлечение информации об ошибке

Дополнительно к таким свойствам, как StackTrace и Message, класс Exception имеет свойство Data. Методы Read и Write используют это свойство, чтобы предоставить информацию об исключении таким образом, чтобы ее можно было легко прочитать для вашего кода, тогда как они предоставляют сообщения об ошибках, предназначенные для людей, через свойство Message.

Описание для каждого исключения (ниже) показывает, какая информация сохраняется в свойстве Data.

Группирование исключений

Когда метод Read обнаруживает ошибку во время чтения данных из файла, он не порождает исключение, но сохраняет его в списке, имеющем тип List<Exception>. После обработки файла метод порождает единственное исключение типа AggregatedException, со списком исключений в его свойстве Data["InnerExceptionsList"]. Это позволяет вам устранить все ошибки во входном файле за раз, вместо их устранения одна за другой.

Вы можете ограничить число исключений, которые собираются, таким образом, установив свойство MaximumNbrExceptions объекта CsvFileDescription, который вы передаете методу Read. По умолчанию, MaximumNbrExceptions установлен в 100. Когда предел достигается, AggregatedException генерируется со списком собранных до текущего момента исключений.

Не все исключения собираются! Перед тем как Read начнет читать данные из файла, он сначала обрабатывает имена столбцов, атрибуты CsvColumn и т.д. Если происходит ошибка во время предварительного этапа, метод порождает исключение.

Задержанное чтение

Из-за задержанного чтения вы будете получать исключения не только при вызове метода Read, но также при доступе к IEnumerable<T>, который возвращается методом Read.

Пример

Следующий код читает файл и обрабатывает исключения. Чтобы показать, как используется свойство Data, он содержит специальную обработку исключения DuplicateFieldIndexException – порождается, когда методы Read и Write обнаруживают два поля или свойства с одинаковым FieldIndex.

public static void ShowErrorMessage(string errorMessage)
{
    // показываем сообщение об ошибке пользователю
    // .....
}

public static void ReadFileWithExceptionHandling()
{
    try
    {
        CsvContext cc = new CsvContext();

        CsvFileDescription inputFileDescription = new CsvFileDescription
        {
            MaximumNbrExceptions = 50
            // ограничиваем число группируемых исключений до 50
        };

        IEnumerable<Product> products =
            cc.Read<Product>("products.csv", inputFileDescription);

        // Выполняем обработку данных
        // ...........

    }
    catch(AggregatedException ae)
    {
        // Обрабатываем все исключения, сгенерированные во время обработки файла

        List<Exception> innerExceptionsList =
            (List<Exception>)ae.Data["InnerExceptionsList"];

        foreach (Exception e in innerExceptionsList)
        {
            ShowErrorMessage(e.Message);
        }
    }
    catch(DuplicateFieldIndexException dfie)
    {
        // имя класса, используемого в методе Read – в этом случае "Продукт"
        string typeName = Convert.ToString(dfie.Data["TypeName"]);

        // имена двух полей или свойств, имеющих одинаковый FieldIndex
        string fieldName = Convert.ToString(dfie.Data["FieldName"]);
        string fieldName2 = Convert.ToString(dfie.Data["FieldName2"]);

        // Действительный FieldIndex, который является общим для двух полей
        int commonFieldIndex = Convert.ToInt32(dfie.Data["Index"]);

        // Как-то обрабатываем эту информацию
        // .........


        // сообщаем пользователю об ошибке
        ShowErrorMessage(dfie.Message);
    }
    catch(Exception e)
    {
        ShowErrorMessage(e.Message);
    }
}

BadStreamException

Это исключение имеет такие же свойства, что и Exception.

Порождается, когда поток, переданный Read, равняется нулю или не поддерживает Seek (поиск). Поток должен поддерживать Seek, в противном случае его нельзя перемотать при доступе к IEnumarable,возвращенному методом Read.

CsvColumnAttributeRequiredException

Это исключение имеет такие же свойства, что и Exception.

Порождается, когда объект CsvFileDescription, переданный Read, имеет FirstLineHasColumnNames и EnforceCsvColumnAttribute, установленные в ложь.

Если в файле нет имен столбцов, то Read основывается на FieldIndex каждого поля или свойства в классе данных, чтобы установить их соответствие с полями данных в файле. Но если EnforceCsvColumnAttributeустановлен в ложь, то предполагается, что поля или свойства без атрибута CsvColumn также могут использоваться для приема данных, хотя они не имеют FieldIndex.

DuplicateFieldIndexException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с неправильными полями/свойствами

Data["FieldName"]

string (строковый)

Поля или свойства с одинаковым FieldIndex

Data["FieldName2"]

Data["Index"]

int (целый)

Общий FieldIndex

Порождается, когда два или более полей или свойств имеют одинаковый FieldIndex.

RequiredButMissingFieldIndexException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с неправильным полем/свойством

Data["FieldName"]

string (строковый)

Поле или свойство без FieldIndex

Когда в первой записи  файла нет имен столбцов (FirstLineHasColumnNames равно ложь), каждое обязательное поле (атрибут CanBeNull установлен в ложь) должно иметь атрибут FieldIndex, в противном случае его нельзя прочитать из файла.

ToBeWrittenButMissingFieldIndexException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с неправильным полем/свойством

Data["FieldName"]

string (строковый)

Поле или свойство без FieldIndex

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

Когда метод Write имеет CsvFileDescription с FirstLineHasColumnNames, установленным в ложь, и находит поле или свойство, которое не имеет FieldIndex, он порождает ToBeWrittenButMissingFieldIndexException.

NameNotInTypeException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с пропущенным полем/свойством

Data["FieldName"]

string (строковый)

Поле или свойство, которое не найдено

Data["FileName"]

string (строковый)

Имя входного файла

Если метод Read имеет CsvFileDescription с FirstLineHasColumnNames, установленным в истину, и одно из имен столбцов в первой записи в файле не соответствует полю или свойству, он порождает NameNotInTypeException.

MissingCsvColumnAttributeException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с неправильным полем/свойством

Data["FieldName"]

string (строковый)

Поле или свойство без атрибута CsvColumn

Data["FileName"]

string (строковый)

Имя входного файла

Метод Read может породить это исключение, когда CsvFileDescription имеет FirstLineHasColumnNames и EnforceCsvColumnAttribute, установленные в истину. Когда Read читает имена столбцов из первой записи, одно из имен столбцов может соответствовать полю или свойству, которое не имеет атрибута CsvColumn, даже если могут использоваться только поля и свойства с атрибутом CsvColumn. Когда это происходит, Read порождает MissingCsvColumnAttributeException.

TooManyDataFieldsException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса данных

Data["LineNbr"]

int (целый)

Строка во входном файле с лишним полем данных

Data["FileName"]

string (строковый)

Имя входного файла

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

TooManyNonCsvColumnDataFieldsException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса данных

Data["LineNbr"]

int (целый)

Строка во входном файле с лишним полем данных

Data["FileName"]

string (строковый)

Имя входного файла

Когда используются только поля или свойства, которые имеют атрибут CsvColumn (Read имеет CsvFileDescription с EnforceCsvColumnAttribute, установленным в истину), и запись во входном файле имеет больше полей данных, чем число полей и свойств с атрибутом CsvColumn, порождается TooManyNonCsvColumnDataFieldsException.

MissingFieldIndexException

Дополнительные свойства - Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса данных

Data["LineNbr"]

int (целый)

Строка с неправильным полем

Data["FileName"]

string (строковый)

Имя входного файла

Если в первой записи входного файла нет имен столбцов (Read имеет CsvFileDescription с FirstLineHasColumnNames, установленным в ложь), то Read основывается на FieldIndex полей и свойств в классе данных, чтобы установить их соответствие полям данных в файле.

Когда запись во входном файле имеет больше полей данных, чем число полей и свойств с FieldIndex в классе данных, порождается MissingFieldIndexException.

MissingRequiredFieldException

Дополнительные свойства – Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с обязательным полем/свойством

Data["FieldName"]

string (строковый)

Имя обязательного поля/свойства

Data["LineNbr"]

int (целый)

Строка, где должно быть пропущенное поле

Data["FileName"]

string (строковый)

Имя входного файла

Порождается, когда запись во входном файле не содержит значения для обязательного поля или свойства (свойство CanBeNull атрибута CsvColumn установлено в ложь).

Различие между нулевой и пустой строкой

Пустые строки и строки, состоящие только из пробела, могут быть заключены в кавычки, поэтому они распознаются как отличные от нуля.

Эти входные строки имеют поля данных "abc", нуль и "def":

abc,,def
abc,   ,def

В то время как эта строка имеет поле данных "abc", за которым следует пустая строка, за которой следует "def":

abc,"",def

и эта линия имеет поле данных "abc", за которым следует строка с тремя пробелами, за которой следует "def":

abc,"   ",def

WrongDataFormatException

Дополнительные свойства – Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса с полем/свойством

Data["FieldName"]

string (строковый)

Имя поля/свойства

Data["FieldValue"]

string (строковый)

Неверное значение данных

Data["LineNbr"]

int (целый)

Строка с неверным значением данных

Data["FileName"]

string (строковый)

Имя входного файла

Порождается, когда поле имеет неверный формат. Например, числовое поле содержит значение "abc".

AggregatedException

Дополнительные свойства – Это исключение имеет такие же свойства, что и Exception, а также ряд дополнительных свойств:

Свойство

Тип

Описание

Data["TypeName"]

string (строковый)

Имя класса данных, используемого Read

Data["FileName"]

string (строковый)

Имя входного файла

Data["InnerExceptionsList"]

List<Exception>

Список Exception (исключений)

Используется для группировки исключений, сгенерированных при чтении файла.

Автор: Matt Perdeck

Загрузить исходный код - 43.2 KB