对于失败的文件解析,我应该抛出什么异常?

时间:2014-10-09 14:54:38

标签: c# parsing exception

我有一个解析文件的方法。但是,这种解析可能会随时失败,具体取决于各种条件(例如,不太谨慎的用户使用该文件)。

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 个答案:

答案 0 :(得分:6)

FileFormatException应该没问题:

  

输入文件或数据流时抛出的异常   应该符合某种文件格式规范   格式错误。

您可以选择提供uri和描述性错误消息。


如果您不想引用WindowsBase,则可以创建特定于您的格式的自己的例外。基于XmlReader.Read引发XmlException的事实。

答案 1 :(得分: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;
    }
}

现在你的方法可能看起来像(也有点过分了一点:

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);
}