异常处理——catch子句中的异常



我正在从文本文件下载数据到db表。文件中的数据偶尔会在字段级别损坏(文件是逗号分隔的.csv文件)

我正在将每一行读入一个对象,该对象表示具有正确数据类型属性的数据行。

如果读入对象失败,由于可疑的数据,我想读入一行到一个类似的对象作为第一个,只有这一个有所有的数据类型设置为字符串,所以读入它应该不会失败。

的想法是,我可以创建一个有效的记录对象的集合,我将加载到适当的db表,和一个异常的集合,我将加载到异常表。这些可以稍后处理。

所以问题是:我将遍历文本文件的行,并将它们加载到对象中,并将对象添加到集合中。这将有一个try/catch循环,如果对象加载失败,那么在catch部分,我将加载异常对象并将其添加到异常集合中。

但是,如果异常对象加载失败(无论出于什么原因)会发生什么。我把try/catch周围,并记录异常-即try/catch内的try/catch?

有更好的方法吗?

  1. catch块内的代码与其他代码没有任何不同。

因此,您必须使用try catch保护每个关键操作,否则您的程序可能会崩溃。

2。这可能是我个人的喜好,但我不建议使用try来控制流,而是使用if。所以使用if语句来检测你的可疑数据

是。您可以在其他catch子句中添加Try-Catch。没关系。

或者像imappler建议的那样,您可以将异常添加到集合中,然后在循环中处理该集合。这将允许您稍后处理带有异常的行。但也许它看起来比Catch子句中的Try-Catch更好。

var exceptionList = new List<ExceptionLines>();
try
{
    // read lines, parse...
}
catch(Exception ex)
{
    // handle the lines with the exception. Add the exception and the necessary arguments to the collection
    exceptionList.Add( new ExceptionLines(....));
}
// do stuff
// handle the exceptions.
foreach(var exception in exceptionList)
{
    try
    {
        // process the exception line.
    }
    catch(Exception ex)
    {
          // log error and handle exception
    }
}

还可以用包装器包装异常。也许这样看起来会更好。

// somewhere in your code...
WrapException( () =>
{
    // read and parse lines...
}, (ex) =>
{
    WrapException(ex, ParseToExceptionFunction, HandleExceptionParseFunction, false);
}, false);
void WrapException(Action func, Action<Exception> handleCatch, bool rethrow)
{
    try
    {
        func();
    }
    catch(Exception ex)
    {
        handleCatch(ex);
        if (rethrow)
            throw;
    }
}
static void WrapException<T>(T arg, Action<T> func, Action<Exception> handleCatch, bool rethrow)
{
    try
    {
        func(arg);
    }
    catch (Exception ex)
    {
        handleCatch(ex);
        if (rethrow)
                throw;
    }
}
void ParseToExceptionFunction(ArgType arg)
{
    // try to parse to excetion
}
void HandleExceptionParseFunction(Exception ex)
{
    // handle the exception for parsing the line with the exception
}

你也可以实现ParseToExceptionFunction和HandleExceptionParseFunction作为lambdas…

所以我采纳了大家的建议。

使用if而不是else来捕获可疑数据,创建良好数据列表和异常列表(由if和else引发),然后在try/catch中处理列表以捕获可能发生的任何其他异常(ref完整性问题等)

谢谢你的建议

最新更新