2012-11-07 122 views
0

我使用FileHelper解析CSV文件。分析文件时遇到的错误消息显示给最终用户。最终用户可能无法理解技术错误信息。没有太多的职员知道什么是Int32Class: UploadFooDtoFileHelper库 - 自定义错误消息

我想定制错误消息,以便它们更加用户友好。喜欢的东西:

  • 行1列2的字符串(一)中输入的不是数字
  • 行2列3 '13 -14-15' 不是一个有效的日期

我在API中找不到任何可以定制错误消息的东西。到目前为止,我得到的最多的是一些扩展方法来清除错误:

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); 
    } 
} 

但是这些扩展仍然有很多不足之处。是否可以自定义错误消息?

+0

我唯一的变化是将ConvertException转换为一个局部变量,使用“var convertInfo = error.ExceptionInfo as ConvertException;”然后检查null,这样你就不会做两次类型检查。 – netniV

回答

0

很难改进你的扩展方法,而不会比它的价值更麻烦。

您不能继承默认转换器(例如,FileHelpers.ConvertHelpers.Int32Converter,因为它们是internalsealed)。您可以为每种类型创建自己的custom converter(并将其基于来自FileHelpers的相应源代码,例如,Int32Converter)。然后你可以提出ConvertException(也可以是sealed,所以你不能继承)的替代方法,它会以不同的方式格式化消息。

+0

哦,我不能忍受密封和内部:)我不知道作者是否会接受拉请求,让他们公开?合并和部署到nuget需要多长时间?现在我认为下一步是使用正则表达式并解析错误消息。脆弱,是的。但这是为了一个非常具体的操作,所以创建特定于上下文的字符串操作不是不成问题。 –

+0

我相信作者@MarcosMeli让他们对所谓的性能好处保密。关于拉请求,FileHelpers库不会非常频繁地更改,但拉请求有时会被接受。看到[change log here](http://teamcity.codebetter.com/viewType.html?buildTypeId=bt66&tab=buildTypeChangeLog) – shamp00

+0

是的,我看到了。我希望他能够考虑这个问题。我看到他在SO上有些活跃。无论如何,我将其标记为答案,因为它最能描述我的选择。 –