CSVHelper:抛出 BadDataException 时记录错误
CSVHelper: logging errors when BadDataException is thrown
我正在尝试配置 BadDataException 消息以包含更多信息,例如用于调试目的的异常发生位置。我已经编写了下面的代码,但似乎抛出的异常是打印出一般错误消息,而不是我配置的错误消息。我想我在这里遗漏了一个逻辑错误,但我不确定。感谢您的帮助!
public void HeaderColumnParser(string PathToFile) {
try {
using (TextReader fileReader = File.OpenText(PathToFile)) {
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) {
BadDataFound = context => {
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
}
};
// csv.Configuration.AllowComments = true;
csv.Read();
csv.ReadHeader();
//while condition returns true till last row
while (csv.Read()) {
string RefDes = "";
//Index 0 gets the ReferenceDesignator if header column exists
if (ColumnIndex[0] > 0) {
if (csv.TryGetField(ColumnIndex[0], out string value)) {
RefDes = value;
}
}
//gets MPN
if (ColumnIndex[1] > 0) {
if (csv.TryGetField(ColumnIndex[1], out string value)) {
MPN.Add(new ManufacturerPartNumber(RefDes, value));
}
}
//Gets Value
if (ColumnIndex[2] > 0) {
if (csv.TryGetField(ColumnIndex[2], out string value)) {
Values.Add(new ComponentValue(RefDes, value));
}
}
//Gets Short description
if (ColumnIndex[3] > 0) {
if (csv.TryGetField(ColumnIndex[3], out string value)) {
DescriptionShort.Add(new ShortDescription(RefDes, value));
}
}
//Gets Long description
if (ColumnIndex[4] > 0) {
if (csv.TryGetField(ColumnIndex[4], out string value)) {
DescriptionLong.Add(new LongDescription(RefDes, value));
}
}
//Gets Manufacturer
if (ColumnIndex[5] > 0) {
if (csv.TryGetField(ColumnIndex[5], out string value)) {
Manufacturer.Add(new Manufacturer(RefDes, value));
}
}
//Gets DNI components
if (ColumnIndex[6] > 0) {
if (csv.TryGetField(ColumnIndex[6], out string value)) {
DNI.Add(new DNI(RefDes, value));
}
}
//Gets the datasheet
if (ColumnIndex[7] > 0) {
if (csv.TryGetField(ColumnIndex[7], out string value)) {
DataSheet.Add(new DataSheet(RefDes, value));
}
}
}
}
}
catch (BadDataException ex) {
throw;
}
}
您创建了 CsvConfiguration
,但您从未使用过它。您可以在创建 CsvReader
.
时使用它
CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
BadDataFound = context => {
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
}
};
var csv = new CsvReader(fileReader, csvConfig);
或者您可以在创建 CsvReader
后配置 BadDataFound
。
编辑:由于提到Version 20.0.0, you can no longer edit CsvReader.Configuration
. As Snympi,现在是只读的。
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
csv.Configuration.BadDataFound = context =>
{
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
};
我正在尝试配置 BadDataException 消息以包含更多信息,例如用于调试目的的异常发生位置。我已经编写了下面的代码,但似乎抛出的异常是打印出一般错误消息,而不是我配置的错误消息。我想我在这里遗漏了一个逻辑错误,但我不确定。感谢您的帮助!
public void HeaderColumnParser(string PathToFile) {
try {
using (TextReader fileReader = File.OpenText(PathToFile)) {
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) {
BadDataFound = context => {
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
}
};
// csv.Configuration.AllowComments = true;
csv.Read();
csv.ReadHeader();
//while condition returns true till last row
while (csv.Read()) {
string RefDes = "";
//Index 0 gets the ReferenceDesignator if header column exists
if (ColumnIndex[0] > 0) {
if (csv.TryGetField(ColumnIndex[0], out string value)) {
RefDes = value;
}
}
//gets MPN
if (ColumnIndex[1] > 0) {
if (csv.TryGetField(ColumnIndex[1], out string value)) {
MPN.Add(new ManufacturerPartNumber(RefDes, value));
}
}
//Gets Value
if (ColumnIndex[2] > 0) {
if (csv.TryGetField(ColumnIndex[2], out string value)) {
Values.Add(new ComponentValue(RefDes, value));
}
}
//Gets Short description
if (ColumnIndex[3] > 0) {
if (csv.TryGetField(ColumnIndex[3], out string value)) {
DescriptionShort.Add(new ShortDescription(RefDes, value));
}
}
//Gets Long description
if (ColumnIndex[4] > 0) {
if (csv.TryGetField(ColumnIndex[4], out string value)) {
DescriptionLong.Add(new LongDescription(RefDes, value));
}
}
//Gets Manufacturer
if (ColumnIndex[5] > 0) {
if (csv.TryGetField(ColumnIndex[5], out string value)) {
Manufacturer.Add(new Manufacturer(RefDes, value));
}
}
//Gets DNI components
if (ColumnIndex[6] > 0) {
if (csv.TryGetField(ColumnIndex[6], out string value)) {
DNI.Add(new DNI(RefDes, value));
}
}
//Gets the datasheet
if (ColumnIndex[7] > 0) {
if (csv.TryGetField(ColumnIndex[7], out string value)) {
DataSheet.Add(new DataSheet(RefDes, value));
}
}
}
}
}
catch (BadDataException ex) {
throw;
}
}
您创建了 CsvConfiguration
,但您从未使用过它。您可以在创建 CsvReader
.
CsvConfiguration csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
BadDataFound = context => {
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
}
};
var csv = new CsvReader(fileReader, csvConfig);
或者您可以在创建 CsvReader
后配置 BadDataFound
。
编辑:由于提到Version 20.0.0, you can no longer edit CsvReader.Configuration
. As Snympi,现在是只读的。
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
csv.Configuration.BadDataFound = context =>
{
throw new BadDataException(context, string.Format("BadDataFound: Bad entry found at field {0}, \n row {1}: {2}", context.Field, context.RawRow, context.RawRecord.Replace("\"", "'")));
};