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("\"", "'")));

};