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

C# 异常处理-catch子句中的异常?,c#,loops,exception,csv,exception-handling,C#,Loops,Exception,Csv,Exception Handling,我正在将文本文件中的数据下载到db表中。文件中的数据偶尔在字段级别损坏(文件是逗号分隔的.csv文件) 我将每一行读入一个对象,该对象表示具有正确数据类型属性的数据行 如果对对象的读取由于数据不可靠而失败,我希望将该行读取到与第一个类似的对象中,只有这一行的所有数据类型都设置为string,因此对它的读取不应该失败 其思想是,我可以创建一个有效记录对象的集合,并将其加载到相应的db表中,以及一个异常集合,并将其加载到异常表中。这些可以在以后处理 所以-问题是: 我将遍历文本文件的行,并将它们加载

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

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

如果对对象的读取由于数据不可靠而失败,我希望将该行读取到与第一个类似的对象中,只有这一行的所有数据类型都设置为string,因此对它的读取不应该失败

其思想是,我可以创建一个有效记录对象的集合,并将其加载到相应的db表中,以及一个异常集合,并将其加载到异常表中。这些可以在以后处理

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

但是,如果异常对象加载失败(无论出于何种原因),会发生什么情况。我是否在其周围放置了一个try/catch并记录异常,即try/catch中的try/catch


有更好的方法吗?

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

或者按照建议,您可以将异常添加到集合中,然后在循环中处理该集合。这将允许您稍后处理带有异常的行。但也许它看起来比在Catch子句中尝试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
    }
}
var exceptionList=新列表();
尝试
{
//读行,解析。。。
}
捕获(例外情况除外)
{
//处理包含异常的行。将异常和必要的参数添加到集合中
添加(新的例外行(..);
}
//做事
//处理异常。
foreach(异常列表中的var异常)
{
尝试
{
//处理异常行。
}
捕获(例外情况除外)
{
//日志错误和句柄异常
}
}
您还可以使用包装器包装异常。也许看起来会更好

// 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
}
//代码中的某个地方。。。
WrapException(()=>
{
//读取和分析行。。。
},(ex)=>
{
WrapException(例如,ParseToExceptionFunction,HandleExceptionParseFunction,false);
},假);
无效包装例外(操作功能、操作手柄、bool回收)
{
尝试
{
func();
}
捕获(例外情况除外)
{
手电筒(ex);
如果(重新播放)
投掷;
}
}
静态无效包装异常(T参数、动作函数、动作句柄、bool rethrow)
{
尝试
{
func(arg);
}
捕获(例外情况除外)
{
手电筒(ex);
如果(重新播放)
投掷;
}
}
void parseToException函数(ArgType arg)
{
//尝试解析到异常
}
void HandleExceptionParseFunction(异常示例)
{
//处理异常以解析包含异常的行
}
您还可以将ParseToExceptionFunction和HandleExceptionParseFunction实现为lambdas

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

    二,。
    这可能是一种个人风格,但我不建议对控制流使用
    try
    ——请改用
    if
    。因此,请使用if语句来检测您的不可靠数据。

    因此,我使用了每个人的建议

    使用if-than-else来捕获不可靠的数据,创建一个良好数据列表和一个异常列表(由if和else提出),然后在try/catch中处理这些列表,以捕获可能出现错误的任何其他异常(参考完整性问题等)


    谢谢你的建议。

    我想说的是,尽量避免将可能失败的代码放在catch部分。也许你可以将异常添加到一个列表中,即一个不会失败的进程,然后在完成第一次解析后处理它。
    try-catch
    确实不能用于控制流,这是一种最高程度的反模式。