异常处理 - catch子句中的异常?

时间:2014-06-27 07:20:12

标签: c# loops exception csv exception-handling

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

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

如果由于狡猾的数据导致读入对象失败,我想将该行读入与第一个类似的对象,只有这一个将所有数据类型设置为字符串,因此读入它不应该为fal。 / p>

我的想法是,我可以创建一个有效记录对象的集合,我将加载到相应的db表中,以及一系列异常,我将加载到异常表中。然后可以稍后处理它们。

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

但是,如果异常对象加载失败(无论出于何种原因)会发生什么。我是否尝试了一下try / catch并记录异常 - 即try / catch中的try / catch?

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

  1. catch块中的代码与其他代码没有任何区别。
  2. 因此,您必须使用try catch保护每个关键操作,否则您的程序可能会崩溃。

    2。 这可能是个人风格,但我不建议将try用于控制流程 - 请改用if。因此,使用if语句来检测您的狡猾数据。

答案 1 :(得分:1)

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

或者如Imapler建议的那样,您可以将异常添加到集合中,然后在循环中处理集合。这将允许您稍后处理具有异常的行。但也许它在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 ......

答案 2 :(得分:0)

所以我使用了所有人的建议。

使用if else来捕获狡猾的数据,创建好的数据列表和异常列表(由if和else提出),然后处理try / catches中的列表以捕获任何其他可能令人厌恶的例外(参考完整性问题等)

感谢您的建议。