Search code examples
filehelpers

FileHelper library - custom error messages


I am use the FileHelper to parse CSV files. Error messages encountered when parsing the file are displayed to the end user. The end user may not be able to make sense of the technical error message. Not too many clerks know what an Int32 is or Class: UploadFooDto.

I would like to customize the error messages so they are more user friendly. Something like:

  • Line 1. Column 2. A string (a) was entered instead of a number
  • Line 2. Column 3. '13-14-15' is not a valid date

I cannot find anything in the API that would allow me to customize the error messages. The most I have so far are some extension methods to clean up the errors:

public static class FileHelperExceptionExtensions
{
    public static string BuildMessage(this ErrorInfo error)
    {
        if (error.ExceptionInfo is ConvertException)
        {
            return ((ConvertException)error.ExceptionInfo).BuildMessage();
        }

        if (error.ExceptionInfo is BadUsageException)
        {
            var message = error.ExceptionInfo.Message;
            var readTo = message.IndexOf("Class:");
            return message.Substring(0, readTo);
        }

        return string.Format("Line: {0}. An unspecific error occured.", error.LineNumber);
    }

    public static string BuildMessage(this ConvertException exception)
    {
        return string.Format("Line: {0}. Column: {1}. Field: {2}. Cannot convert '{3}' to type: '{4}'", exception.LineNumber, exception.ColumnNumber, exception.FieldName, exception.FieldStringValue, exception.FieldType.Name);
    }
}

but these extensions still leave a lot to be desired. Is it possible to customize the error messages?


Solution

  • It's hard to improve on your extension methods without it being more hassle than it's worth.

    You cannot subclass the default converters (e.g., FileHelpers.ConvertHelpers.Int32Converter since they are internal and sealed). You could create your own custom converter for each type (and base it on the corresponding source code from FileHelpers, e.g., Int32Converter). Then you can raise an alternative to ConvertException (also sealed so you cannot subclass) which would format the message differently.