异常处理——catch子句中的异常
本文关键字:异常 子句 catch 异常处理 | 更新日期: 2023-09-27 18:10:34
我正在从文本文件下载数据到db表。文件中的数据偶尔会在字段级别损坏(文件是逗号分隔的.csv文件)
我正在将每一行读入一个对象,该对象表示具有正确数据类型属性的数据行。
如果读入对象失败,由于可疑的数据,我想读入一行到一个类似的对象作为第一个,只有这一个有所有的数据类型设置为字符串,所以读入它应该不会失败。
的想法是,我可以创建一个有效的记录对象的集合,我将加载到适当的db表,和一个异常的集合,我将加载到异常表。这些可以稍后处理。
所以问题是:我将遍历文本文件的行,并将它们加载到对象中,并将对象添加到集合中。这将有一个try/catch循环,如果对象加载失败,那么在catch部分,我将加载异常对象并将其添加到异常集合中。
但是,如果异常对象加载失败(无论出于什么原因)会发生什么。我把try/catch周围,并记录异常-即try/catch内的try/catch?
有更好的方法吗?
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完整性问题等)
谢谢你的建议