我是否干净地编写了这个异常处理?

时间:2011-12-16 18:40:06

标签: c# .net exception-handling

我意识到有关异常处理的最佳实践的一些问题,但我不得不对我发现的示例做一些调整。我的目标是摆脱诸如“ArgumentException”,“FileNotFoundException”,“ArrayIndexOutOfBoundsException”等基本异常。

如果您可以在层次结构中描绘以下代码。所以Process()调用ValidateData()调用CSVData()。我基本上都在做同样类型的事情,包装所有已知函数,包括我的自定义函数,然后将其放在方法的异常中,并将其作为内部异常传递。这是一个很好的方式来完成这项任务吗?它适用于我,但我想养成以非常干净的方式处理异常的习惯,因为我的一些过去的项目已经被“捕获”所覆盖(例外e )....并解析e.Message ......“

这是我的示例代码:

public class CSVData
{
    DataTable data;
    public CSVData(string file)
    {
        try
        {
            this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions
        }
        catch (FileNotFoundException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (IOException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (ArgumentNullException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (ArgumentException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (OutOfMemoryException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
    }

    class FailedLoadingCSVException : Exception
    {
        public int failedAtLine;

        public FailedLoadingCSVException(Exception e, int failedLine, string file)
            :base ("The system failed at loading "+file+" at line "+failedLine, e)
        {
            this.failedAtLine = failedLine;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

try
{
}
catch ( Exception ex )
{
   if ( e is FileNotFoundException ||
        e is IOException ||
        // enumerate few 
       )
       throw new FailedLoadingCSVException(e, currentLine, file);
   else
       throw; // rethrow all other exceptions without touching them         
}

答案 1 :(得分:0)

每个捕获区的主体是相同的。在这种情况下,不需要捕获特定的异常类型,因为您没有采取特定于类型的操作。这样更好:

   try 
    { 
        this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions 
    } 
    catch (Exception e) 
    { 
        throw new FailedLoadingCSVException(e, currentLine, file); 
    } 

答案 2 :(得分:-2)

try
{
    this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions
}
catch (Exception e)
{
   Console.WriteLine(e.Message);        
}
//unless you know what the exact Exception of the CSVReader is you can always just use Base Exception Class..