我意识到有关异常处理的最佳实践的一些问题,但我不得不对我发现的示例做一些调整。我的目标是摆脱诸如“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;
}
}
}
答案 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..