2014-10-09 4 views
1

У меня есть метод разбора файла. Однако этот синтаксический анализ может быть неудачным в любое время, в зависимости от различных условий (например, не очень осторожный пользователь, играющий с файлом).Какое исключение я должен использовать для неудачного анализа файлов?

public string ParseDatFile(string datFile) 
{ 
    string[] deezLines = File.ReadAllLines(datFile); 

    // We're searching for an essential data inside the file. 
    bool daEssentialDataFound = false; 
    foreach (string datLine in deezLines) 
    { 
     if (datLine.Contains("daEssentialData")) 
     { 
      daEssentialDataFound = true; 
      break; 
     } 
    } 

    if (!daEssentialDataFound) 
     throw new WhatShouldIThrowException("yo dood where's da essential data in " + datFile + "?"); 

    DoStuffWith(deezLines); 
} 

Есть ли исключение, которое я мог бы использовать в таком случае? я думал о:

  • FormatException: не совсем понятно, о проблеме,
  • Пользовательские исключения: У меня нет никакого специального лечения для исключения я выбрасываю, так что я бы предпочел избегайте использования специального исключения, хотя это всегда способ уладить все.
+2

Как в стороне, вы можете упростить выше: 'if (! deezLines.Any (l => l.Contains (" daEssentialData ")))' –

+1

Как насчет 'YoDoodException'? –

+0

@Tim Действительно, я все еще довольно я не использовал это. – Kilazur

ответ

6

FileFormatException должно быть прекрасно:

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

Возможна установка uri и описательного сообщения об ошибке.


Если вы не хотите, чтобы ссылаться на WindowsBase, то вы можете создать свое собственное исключение, специфичное для вашего формата. Исходя из того, что есть XmlException, брошенный XmlReader.Read.

+3

Я бы не использовал это. ed в 'WindowsBase', поэтому это не будет доступно для многих проектов (console, ASP.Net ...), и вы не хотите добавлять ссылку только для этого класса. – ken2k

+0

По умолчанию это не доступно в winforms, не так ли? –

+0

@TimSchmelter Нет, это не – ken2k

1

Я хотел бы бросить специальное исключение, так что повышает читабельность и позволяет уловить, что, специфические исключения:

public class InvalidFileFormatException : System.FormatException 
{ 
    public InvalidFileFormatException(string exText) : base(exText) { } 
} 

// you could even provide an exception if a single line has an invalid format 
public class SpecificLineErrorException : InvalidFileFormatException 
{ 
    public string Line { get; set; } 
    public SpecificLineErrorException(string exText, string line) : base(exText) 
    { 
     this.Line = line; 
    } 
} 

Теперь ваш метод может выглядеть (также linqified его немного:

public string ParseDatFile(string datFile) 
{ 
    string[] deezLines = File.ReadAllLines(datFile); 
    if(!deezLines.Any(l => l.Contains("daEssentialData"))) 
     throw new InvalidFileFormatException("yo dood where's da essential data in " + datFile + "?"); 
    DoStuffWith(deezLines); 
} 
+0

Но почему кто-нибудь поймает это конкретное исключение? Что мне делать с «SpecificLineErrorException» по сравнению с «InvalidFileFormatException» с точки зрения приложения? –

+1

@PrestonGuillot: если вы разбираете огромный файл, вы часто не хотите отменять весь процесс разбора только из-за нескольких недопустимых строк. Но вы хотите зарегистрировать это или сделать с ними какие-то другие вещи. Хорошим примером является ['MalformedLineException'] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.malformedlineexception (v = vs.110) .aspx)', используемый [' TextFieldParser'] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.errorline (v = vs.110) .aspx). Кстати, это исключение также будет хорошим встроенным кандидатом;) –

+1

[Этот другой популярный CSV-Parser] (http: //www.codeproject.com/Articles/9258/A-Fast-CSV-Reader) также имеет определенные исключения, такие как «MissingFieldCsvException» или «MalformedCsvException» и возможность устанавливать полезные действия, такие как «AdvanceToNextLine», «RaiseEvent» или «ThrowError» в соответствии с типом исключения , –

Смежные вопросы